选择2个字段并返回带有不同值的已排序数组

时间:2016-06-17 14:16:15

标签: mongodb mongodb-query aggregation-framework

说我们有以下文档:

{a: 1, b: 2},
{a: 2, b: 0},
{a: 3, b: 1}

我想要一个将返回的查询:

[0, 1, 2, 3]

我想知道是否有办法更快地完成这项工作:

  • 只进行2次查询,一次选择a,另一次选择b,然后合并到我的应用中。
  • 使用map reduce(与之前的方法相比实际上很慢)

2 个答案:

答案 0 :(得分:4)

您需要$group我们的文档并使用$push累加器运算符在集合中返回“a”和“b”数组。

$project运算符中,您使用$setUnion运算符来过滤掉重复项。

db.coll.aggregate(
    [
        { "$group": { 
            "_id": null, 
            "a": { "$push": "$a" }, 
            "b": { "$push": "$b" } 
        }}, 
        { "$project": {
            "_id": 0, 
            "merged": { "$setUnion": [ "$a", "$b" ] } 
        }} 
    ]
)

产生:

{ "merged" : [ 3, 2, 0, 1 ] }

答案 1 :(得分:1)

你可以使用类似的东西

db.getCollection('yourdocs').aggregate([
     { 
        $project: { 
            values: [ "$a", "$b" ] 
        } 
     },
     {
         $unwind: "$values"
     },
     {
         $group: {
             _id: "distinctValues",
             values: {
                 $addToSet: "$values"
             }
         }
     }
])

将导致

{
    "_id" : "distinctValues",
    "values" : [ 
        0, 
        1, 
        2, 
        3
    ]
}

更新:只需阅读您希望它排序,$addToSet无法保证。如果排序对您至关重要,只需在上面的阶段之后将以下内容添加到聚合管道

{
    "$unwind": "$values"
},
{
    "$sort": { 
        "values": 1
    }
},
{
    "$group": { 
        _id: "distinctValues",
        "values": {
            "$push": "$values"
        }
    }
}