Mongodb 3.2和3.0 $展开聚合

时间:2016-05-24 07:53:18

标签: mongodb

我已经创建了一个查询并在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,我得到的页面有两个或更多组,我不需要它。

2 个答案:

答案 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);