我已经创建了一个查询并在robomongo中查看它并且它在mongodb 3.2中正常工作
db.post.aggregate([
{$unwind: {path: "$page_groups", preserveNullAndEmptyArrays: true}},
{$group: {_id: "$page_groups",
page_names: {$addToSet: "$page_name"}}},
])
但不幸的是,我需要在mongodb 3.0中获取相同的数据 谁能告诉我如何在mongo 3.0中获取空数组的数据并通过数组键获得结果?
没有$ unwind,我得到的页面有两个或更多组,我不需要它。
答案 0 :(得分:1)
谢谢你回答,我想先使用$ project,但我想我已经找到了使用$ match和array $ size更简单的方法来忽略数组得到多个元素的结果:
db.post_summary.aggregate([
{$match: {$or:
[{page_groups: {$size: 1}}, {page_groups: {$size: 0}}]}},
{$group: {
_id: "$page_groups",
page_names: { "$addToSet": "$page_name" }
}},
])
在我的情况下,“page_groups”具有以下结构:
page_groups:[
0 =>[_id, group_name]
1 =>[_id, group_name]
]
答案 1 :(得分:0)
要模仿3.2 for 3.0聚合管道操作中的preserveNullAndEmptyArrays
$unwind
选项,请生成一个初始的 $project
管道阶段如果数组字段为null或为空(使用 $ifNull
运算符),则创建数组字段:
var pipeline = [
{
"$project": {
"pg": {
"$ifNull": [
"$page_groups",
["Unspecified"]
]
},
"page_name": 1
}
},
{ "$unwind": "$page_groups" },
{
"$group": {
"_id": "$page_groups",
"page_names": { "$addToSet": "$page_name" }
}
}
];
db.collection.aggregate(pipeline);