MongoDB组并找到值不重要的结果

时间:2017-01-30 13:22:00

标签: mongodb

我的数据库中有以下文档:

{
    id: ObjectId(...),
    value1: 0,
    value2: false
}, {
    id: ObjectId(...),
    value1: 0,
    value2: true
}, {
    id: ObjectId(...),
    value1: 1,
    value2: false
}, {
    id: ObjectId(...),
    value1: 1,
    value2: false
}, {
    id: ObjectId(...),
    value1: 1,
    value2: false
}

我希望按值1对所有对象进行分组,并找到那些没有值2 =真的对象。

查看value1 = 0的对象。 您可以看到存在一个value2 = true的文档。

对于value1 = 1,不存在value2 = true的文档 我希望拥有所有这个值1,我没有值2 =真。

db.getCollection('collection').aggregate([
    {$group: {_id: {'value1': '$value1', 'value2' : '$value2'}, count: {$sum:1}}},
    {$match: {'_id.value2': true, count: {$eq: 0}}}
])

我尝试了这个,但是这找不到任何东西 因为我过滤了真正的价值观。所以没有什么好算的。

我希望你了解我并能帮助我。


编辑1 - 我想要的结果:
我希望得到类似的东西:

{
    value1: 0,
    count: 1   // value1=0 has exactly 1 document with value2=true
}, {
    value1: 1, // <-- Im just interested in this values which has the count of 0
    count: 0   // <-- value1=1 has NO documents with value2=true
}

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。这将保留values2至少有一个真值或所有values2都为假的所有组

db.collection.aggregate([{
    $group: {
        _id: "$value1",
        values2: {
            $push: "$value2"
        }
    }
}, {
    $redact: {
        $cond: {
            if: {
                $or: [{
                    $anyElementTrue: ["$values2"]
                }, {
                    $setEquals: ["$values2", [false]]
                }]
            },
            then: "$$KEEP",
            else: "$$PRUNE"
        }
    }
}])