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

Монго агрегатен вложен масив

Най-простата форма на това е да запазите нещата ключени от "параметъра" "име":

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"
       }}
   }}
)

Ако винаистина трябва да имате "стойностите" на имената като стойности на полето, вие можете направете следното. Но тъй като „проектирате“ полетата/свойствата, трябва да ги посочите всички във вашия код . Вече не можете да бъдете „динамични“ и кодирате/генерирате всеки един:

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" }
    }}

])

Така че докато допълнителните стъпки ви дават резултата, който искате (добре с окончателен проект за промяна на _id към userId ), според мен кратката версия е достатъчно работеща, освен ако наистина не се нуждаете от нея. Обмислете и изхода от там:

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

Така че това бих използвал лично аз. Но вашият избор.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Опитвам се да направя масово upsert с Mongoose. Кой е най-чистият начин да направите това?

  2. MongoTemplate upsert – лесен начин да направите актуализация от pojo (който потребител е редактирал)?

  3. Mongodb агрегатно сортиране и ограничение в рамките на групата

  4. Преместване на HDFS данни в MongoDB

  5. NodeJS + Mongo - как да получите съдържанието на колекцията?