2015-01-11 2 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" } } } ]); 

, но я бы сейчас использовать $ размер в каждом документы моего имена массив.

Можно ли получить этот результат (где «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/), на который ссылается OP их вопрос - это функция MongoDB 2.6 и выше, которая эффективно сообщает размер массива. Поэтому больше не нужно разматывать массивы только для подсчета элементов. –

+0

Да, ваш ответ потрясающий, Нейл - Спасибо –

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