我的数据库中有以下文档:
{
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
}
答案 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"
}
}
}])