MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongodb обобщава (брои) в множество полета едновременно

Рамката за агрегиране няма да създава ключове въз основа на данни, нито трябва вие дори го правите, тъй като "данните" не са ключ, а всъщност данни, така че трябва да се придържате към шаблона.

Това означава, че по принцип можете просто да направите това:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }}
])

И това ще отчита събитията на ден от седмицата за събитие, макар и в множество документи в изхода, но това е лесно да се промени в един документ за събитие:

db.data.aggregate([
    { "$group": {
        "_id": {
            "event_type": "$event",
            "day": { "$dayOfWeek": "$date" }
        },
        "count": { "$sum": 1 } 
    }},
    { "$group": {
        "_id": "$_id.event_type",
        "days": { "$push": { "day": "$_id.day", "count": "$count" } }
    }}
])

И това е под формата на масив, но все пак съдържа резултатите, които искате.

Ако наистина сте готови да изпълните точната си форма, тогава искате да направите нещо подобно:

db.data.aggregate([
    { "$group": {
        "_id": "$event",
        "1": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
                    1,
                    0
                ]
            }
        },
        "2": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
                    1,
                    0
                ]
            }
        },
        "3": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
                    1,
                    0
                ]
            }
        },
        "4": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
                    1,
                    0
                ]
            }
        },
        "5": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
                    1,
                    0
                ]
            }
        },
        "6": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
                    1,
                    0
                ]
            }
        },
        "7": {
            "$sum": {
                "$cond": [
                    { "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
                    1,
                    0
                ]
            }
        }
    }}
)

Но това е наистина дълго, така че IMHO бих се придържал към първото или може би второто решение, тъй като те са по-кратки и по-лесни за четене.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как можете да премахнете всички документи от колекция с Mongoose?

  2. Пагинация на монго с пролетни данни

  3. Как да върна резултатите от Mongoose от метода за намиране?

  4. Запазете подмножество от колекция MongoDB в друга колекция

  5. Изграждане на mongo-cxx-driver с помощта на CMake ExternalProject_Add