2015-01-11 29 views
0

下面是我收集的結構部分:

_id: ObjectId("W"), 
names: [ 
    { 
     number: 1, 
     list: ["A","B","C"] 
    }, 
    { 
     number: 2, 
     list: ["B"] 
    }, 
    { 
     number: 3, 
     list: ["A","C"] 
    } 
    ... 
], 
... 

我用這個請求:

db.publication.aggregate([ { $match: { _id: ObjectId("54a1de90453d224e80f5fc60") } }, { $group: { _id: "$_id", SizeName: { $first: { $size: { $ifNull: [ "$names", [] ] } } }, names: { $first: "$names" } } } ]); 

,但我現在在每一個使用$大小我的文件名稱爲 array。

是否有可能得到這樣的結果(其中「SizeList的」是$大小的結果):

_id: ObjectId("W"), 
SizeName: 3, 
names: [ 
    { 
     SizeList: 3, 
     number: 1, 
     list: ["A","B","C"] 
    }, 
    { 
     SizeList: 1, 
     number: 2, 
     list: ["B"] 
    }, 
    { 
     SizeList: 2, 
     number: 3, 
     list: ["A","C"] 
    } 
    ... 
], 
... 

回答

4

所有你真的想在這裏是一個$project階段和使用$map改變陣列成員的內容:

db.names.aggregate([ 
    { "$project": { 
     "SizeName": { "$size": "$names" }, 
     "names": { "$map": { 
      "input": "$names", 
      "as": "el", 
      "in": { 
       "SizeList": { "$size": "$$el.list" }, 
       "number": "$$el.number", 
       "list": "$$el.list" 
      } 
     }} 
    }} 
]) 

可以交替$unwind和組這一切回來的過程,但是這是那種長篇大論時,你有MongoDB的2.6反正。

0

這未必是最有效的方式,但我認爲它確實你的目標做什麼:

db.publication.aggregate([ 
    { $unwind: '$names' }, 
    { $unwind: '$names.list' }, 
    { $group: { 
     _id: { _id: "$_id", number: "$names.number" }, 
     SizeList: { $sum: 1 }, 
     list: { $push: "$names.list" } 
     } 
    }, 
    { $group: { 
     _id: "$_id._id", 
     names: { 
      $push: { 
       number: "$_id.number", 
       list: "$list", 
       SizeList: "$SizeList" 
      } 
     }, 
     SizeName: {$sum: 1} 
     } 
    } 
]); 
+0

您可能不知道操作系統所提及的[**'$ size' **](http://docs.mongodb.org/manual/reference/operator/aggregation/size/)操作符他們的問題是MongoDB 2.6和更高的功能,可以有效地報告數組的大小。因此,不再需要展開數組來計算元素。 –

+0

是的,你的回答很棒,尼爾 - 謝謝 –