2016-10-04 98 views
3

我有MongoDB的內容如下:組嵌套內陣列中貓鼬

[{ 
"_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」,其中它包含具有不同類別ID的對象的陣列。

我需要 1.選擇類別,其ID是「57c3df061eb1e59d3959cc40」 2.上述所選類別包含的值作爲陣列 3.從值陣列,我要組元件根據第二值和需要得到用戶名稱表

例如,輸出:

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

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

我已使用如下聚合函數試圖組

從上面的查詢中,它根據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 ...這是一個版本問題..如果是這樣的話,版本3.2中引入了3.0.12版本 – user3211705

+0

Operator $ arrayElemAt中'$ arrayElemAt'的等價物。所以,它不適用於3.0版本。 – 4J41

+0

3.0.12 mongodb版本中是否有'$ arrayElemAt'的等價物? – 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

上面的例子使用數組中的第一個值分組數據..我應該如何使用第二個值組?即。值[1] .. – user3211705

+0

您使用哪個mongodb版本? – chridam

+0

我已將mongoDb版本從3.0.12升級到3.2.10 – user3211705