在聚合中匹配整个数组

时间:2015-09-29 14:15:12

标签: mongodb aggregation-framework

我有一个简单的mongodb集合(聚合管道的摘录),比如说

[
 {_id : [3, 3] ,  val : 7},
 {_id : [3, 2] ,  val : 9},
 {_id : [1, 3] ,  val: 10}
]

我想要$match来获取[3, 3]记录。 但是使用

$match : {$_id: { $all: [3, 3]}}

也会返回[3, 2],这是我们不想要的。任何人?

1 个答案:

答案 0 :(得分:2)

我只能看到这种情况可能发生在这样的情况下:

{ "like": 1, "id": 3, "val": 7 },
{ "like": 1, "id": 3, "val": 7 },
{ "like": 2, "id": 3, "val": 5 },
{ "like": 2, "id": 2, "val": 5 },

然后汇总:

db.collection.aggregate([
    { "$group": {
        "_id": "$like",
        "id": { "$push": "$id" },
        "val": { "$max": "$val" }
    }},
    { "$project": {
        "_id": "$id",
        "val": 1
    }}
])

给出了:

{ "_id" : [ 3, 2 ], "val" : 5 }
{ "_id" : [ 3, 3 ], "val" : 7 }

对于我们来说,$all条件基本上被视为“集合”,就像$in一样。这意味着[3,3]基本上缩减为3。因此,如果您想要“明确”匹配,请执行此操作:

db.collection.aggregate([
    { "$group": {
        "_id": "$like",
        "id": { "$push": "$id" },
        "val": { "$max": "$val" }
    }},
    { "$project": {
        "_id": "$id",
        "val": 1
    }},
    { "$match": {
        "_id": [3,3]
    }}
])