MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zagnieżdżona tablica agregatów Mongo

Najprostszą formą tego jest utrzymywanie kluczy według "parametru" "nazwy":

db.collection.aggregate(
   // Unwind the array
   { "$unwind": "$parameter"},

   // Group on the "_id" and "name" and $sum "value"
   { "$group": {
       "_id": { 
           "userId": "$userId",
           "name": "$parameter.name"
       }, 
       "value": { "$sum": "$parameter.value" } 
   }},

   // Put things into an array for "nice" processing
   { "$group": {
       "_id": "$_id.userId",
       "values": { "$push": { 
           "name": "$_id.name",
           "value": "$value"
       }}
   }}
)

Jeśli naprawdę musisz mieć „wartości” nazw jako wartości pól, możesz wykonaj następujące czynności. Ale ponieważ „odwzorowujesz” pola/właściwości, musisz określić je wszystkie w swoim kodzie . Nie możesz już być „dynamiczny” i kodujesz/generujesz każdy:

db.collection.aggregate([
    // Unwind the array
    { "$unwind": "$parameter"},

   // Group on the "_id" and "name" and $sum "value"
    { "$group": {
        "_id": {
             "userId": "$userId",
             "name": "$parameter.name"
        },
        "value": { "$sum": "$parameter.value"}
    }},

    // Project out discrete "field" names with $cond
    { "$project": {
        "name1": { "$cond": [
            { "$eq": [ "$_id.name", "name1" ] },
            "$value",
            0
        ]},
        "name2": { "$cond": [
            { "$eq": [ "$_id.name", "name2" ] },
            "$value",
            0
        ]},
        "name3": { "$cond": [
            { "$eq": [ "$_id.name", "name3" ] },
            "$value",
            0
        ]},
    }},

    // The $cond put "0" values in there. So clean up with $group and $sum
    { "$group": { 
        _id: "$_id.userId",
        "name1": { "$sum": "$name1" },
        "name2": { "$sum": "$name2" },
        "name3": { "$sum": "$name3" }
    }}

])

Więc podczas gdy dodatkowe kroki dają pożądany rezultat (dobrze z końcowym projektem, aby zmienić _id na userId ), moim zdaniem krótka wersja jest wystarczająco wykonalna, chyba że naprawdę jej potrzebujesz. Rozważ również dane wyjściowe z tego miejsca:

{
    "_id" : ObjectId("53245016ea402b31d77b0372"),
    "values" : [
        {
            "name" : "name3",
            "value" : 2
        },
        {
            "name" : "name2",
            "value" : 0
        },
        {
            "name" : "name1",
            "value" : 150
        }
    ]
}

Więc tego bym użył osobiście. Ale twój wybór.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Grupa MongoDB i suma z identyfikatorem jako kluczem

  2. Jak działa hideIndex() w MongoDB?

  3. Podłączanie MongoDB z aplikacji mobilnej lub przeglądarkowej

  4. Jak wykonać zapytanie za pomocą lub warunek w mongoid

  5. Zobacz postęp długo działającego zadania agregacji mongodb