2016-10-04 3 views
3

У меня есть содержание MongoDB, как показано ниже:Group вложен внутренний массив в мангусте

[{ 
"_id": { 
    "$oid": "57c6699711bd6a0976cabe8a" 
}, 
"ID": "1111", 
"FullName": "AAA", 
"Category": [ 
    { 
     "CategoryId": { 
      "$oid": "57c66ebedcba0f63c1ceea51" 
     }, 
     "_id": { 
      "$oid": "57e38a8ad190ea1100649798" 
     }, 
     "Value": [ 
      { 
       "Name": "" 
      } 
     ] 
    }, 
    { 
     "CategoryId": { 
      "$oid": "57c3df061eb1e59d3959cc40" 
     }, 
     "_id": { 
      "$oid": "57e38a8ad190ea1100649797" 
     }, 
     "Value": [ 
      [ 
       "111", 
       "XXXX", 
       "2005" 
      ], 
      [ 
       "1212", 
       "YYYY", 
       "2000" 
      ], 
      [ 
       "232323", 
       "ZZZZZ", 
       "1999" 
      ] 
     ] 
    } 
] 
},{ 
    "_id": { 
     "$oid": "57c6699711bd6a0976cabe8a" 
    }, 
    "ID": "1111", 
    "FullName": "BBB", 
    "Category": [ 
     { 
      "CategoryId": { 
       "$oid": "57c66ebedcba0f63c1ceea51" 
      }, 
      "_id": { 
       "$oid": "57e38a8ad190ea1100649798" 
      }, 
      "Value": [ 
       { 
        "Name": "" 
       } 
      ] 
     }, 
     { 
      "CategoryId": { 
       "$oid": "57c3df061eb1e59d3959cc40" 
      }, 
      "_id": { 
       "$oid": "57e38a8ad190ea1100649797" 
      }, 
      "Value": [ 
       [ 
        "4444", 
        "XXXX", 
        "2005" 
       ], 
       [ 
        "7777", 
        "GGGG", 
        "2000" 
       ], 
       [ 
        "8888", 
        "ZZZZZ", 
        "1999" 
       ] 
      ] 
     } 
    ] 
}] 

Здесь у меня есть массив с именем «ResumeCategory», где она содержит объекты с различной категорией ид.

мне нужно 1. Выберите категорию, идентификатор «57c3df061eb1e59d3959cc40» 2. выше выбранной категории содержит значение как массив 3. Из массива значений, у меня есть к группе элементов на основе второго значения и должны получить имя пользователя список

Например Выход:

[{ 
    'CategoryName': 'XXXX', 
    'Users': ['AAA', 'BBB'] 
}, 
{ 
    'CategoryName': 'YYYY', 
    'Users': ['AAA'] 
}, 
{ 
    'CategoryName': 'ZZZZZ', 
    'Users': ['AAA', 'BBB'] 
}, 
{ 
    'CategoryName': 'GGGG', 
    'Users': ['BBB'] 
}] 

Я попытался сгруппировать с помощью агрегатной функции, как показано ниже:

resume.aggregate([ 
    {$match: {'Category.CategoryId': new ObjectId('57c3df191eb1e59d3959cc43')}}, 
    {$unwind: '$Category'}, 
    {$unwind: '$Category.Value'}, 
    {$match: {'Category.CategoryId': new ObjectId('57c3df191eb1e59d3959cc43')}}, 
    {$group: { _id: '$Category.Value', count: {$sum: 1}}}, 
    {$project: {'_id':0, TagValue: '$_id',count: '$count'}} 
],function(err, resData){ 
     res.send(resData); 
}); 

Из вышеприведенного запроса он сгруппирован на основе массива Value. Он принимает массив с тремя элементами для группировки. Может ли кто-нибудь помочь группировать значение, основанное на внутреннем значении массива (один элемент, т.е. значение [1]), и получить желаемый результат.

Заранее спасибо.

ответ

1

На этапе проекта вы можете использовать $arrayElemAt (представленный в версии 3.2), чтобы выбрать второй элемент в массиве.

db.resume.aggregate([ 
         {"$unwind":"$Category"}, 
         {"$match":{"Category.CategoryId" :ObjectId("57c3df061eb1e59d3959cc40")}}, 
         {"$unwind":"$Category.Value"}, 
         {"$project":{"FullName":1, "secondVal" : {"$arrayElemAt": ["$Category.Value",1]} }}, 
         {"$group":{"_id":"$secondVal", "Users":{"$addToSet":"$FullName"}}}, 
         {"$project":{"CategoryName":"$_id", "_id": 0, "Users":1}} 
        ]) 

Пример вывод:

{ "Users" : [ "AAA", "BBB" ], "CategoryName" : "XXXX" } 
{ "Users" : [ "AAA" ], "CategoryName" : "YYYY" } 
{ "Users" : [ "BBB" ], "CategoryName" : "GGGG" } 
{ "Users" : [ "AAA", "BBB" ], "CategoryName" : "ZZZZZ" } 
+0

Привет .. Я получаю ошибки как «недопустимые оператор $ arrayElemAt '. Моя версия MongoDb - 3.0.12 ... Это проблема с версией. Если да, то какой эквивалент '$ arrayElemAt' в версии 3.0.12 – user3211705

+0

Оператор $ arrayElemAt 'был представлен с версией 3.2. Таким образом, он не будет работать с версией 3.0. – 4J41

+0

Есть ли эквивалент для '$ ​​arrayElemAt' в версии 3.0.12 mongodb ??? – user3211705

1

Вам просто нужно $unwind"Category.Value" поля дважды, так как она имеет двойные вложенные массивы:

resume.aggregate([ 
    { "$match": { "Category.CategoryId": "57c3df061eb1e59d3959cc40" } }, 
    { "$unwind": "$Category" }, 
    { "$match": { "Category.CategoryId": "57c3df061eb1e59d3959cc40" } },  
    { "$unwind": "$Category.Value" },// <-- unwind twice 
    { 
     "$unwind": { 
      "path": "$Category.Value", 
      "includeArrayIndex": "idx" 
     } 
    }, 
    { "$match": { "idx": 1 } }, 
    { 
     "$group": { 
      "_id": "$Category.Value", 
      "Users": { "$push": "$FullName" }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$project": { "_id": 0, "CategoryName": "$_id", "Users": 1, "count": 1 } } 
], function(err, resData){ 
    res.send(resData); 
}); 
+0

Пример выше сгруппированных данных с использованием первого значения в массиве. Как использовать второе значение для группировки? то есть. value [1] .. – user3211705

+0

Какую версию mongodb вы используете? – chridam

+0

Я обновил версию mongoDb с 3,0.12 до 3,2.10. – user3211705

Смежные вопросы