MongoDB 用于查找布尔值的聚合管道
MongoDB aggregation pipeline to find boolean value
我想找出集合中的所有匹配文档,其中 MatchCondition 为 false。我正在尝试使用匹配运算符在聚合管道中执行此操作,但这不起作用。
{
"_id": {
"$oid": "98rr6c03a82b7785f372c018"
},
"document": "DocumentName",
"ecuCheckResultList": [
{
"animal": "CAT",
"attribute1": "value",
"attribute2": "value",
"MatchCondition": true
},
{
"animal": "DOG",
"attribute1": "value",
"MatchCondition": false
}
]
}
我知道可以使用查找来执行此操作,但是需要对这些数据进行单独的操作,因此使用聚合管道。
最后,我需要找出集合中每只动物的总计数 MatchCondition = false
我的集合中有超过 190 万个文档,我想查询这些文档。
您可以$map
构造一个辅助布尔数组来检查MatchCondition
是否为假。对于您的情况,一个简单的 $not
将起作用,因为它可以将 false 翻转为 true。然后,使用$anyElementTrue
进行过滤。
db.collection.aggregate([
{
"$match": {
$expr: {
"$anyElementTrue": {
"$map": {
"input": "$ecuCheckResultList.MatchCondition",
"as": "mc",
"in": {
$not: "$$mc"
}
}
}
}
}
}
])
这里是Mongo playground供您参考。
查询 1
- unwind 替换 root 使每个成员成为根文档
- 匹配条件为假
- 按 anima 分组并计数
Playmongo
(对于每个阶段in/out
,您可以将鼠标放在阶段的尽头)
aggregate(
[{"$unwind": "$ecuCheckResultList"},
{"$replaceRoot": {"newRoot": "$ecuCheckResultList"}},
{"$match": {"$expr": {"$eq": ["$MatchCondition", false]}}},
{"$group": {"_id": "$animal", "count": {"$sum": 1}}}])
查询2
- 与上面相同,但首先过滤以仅保留条件 false
并在
之后放松
*可能比之前更快
aggregate(
[{"$set":
{"ecuCheckResultList":
{"$filter":
{"input": "$ecuCheckResultList",
"cond": {"$eq": ["$$this.MatchCondition", false]}}}}},
{"$unwind": "$ecuCheckResultList"},
{"$group": {"_id": "$ecuCheckResultList.animal", "count": {"$sum": 1}}}])
我想找出集合中的所有匹配文档,其中 MatchCondition 为 false。我正在尝试使用匹配运算符在聚合管道中执行此操作,但这不起作用。
{
"_id": {
"$oid": "98rr6c03a82b7785f372c018"
},
"document": "DocumentName",
"ecuCheckResultList": [
{
"animal": "CAT",
"attribute1": "value",
"attribute2": "value",
"MatchCondition": true
},
{
"animal": "DOG",
"attribute1": "value",
"MatchCondition": false
}
]
}
我知道可以使用查找来执行此操作,但是需要对这些数据进行单独的操作,因此使用聚合管道。
最后,我需要找出集合中每只动物的总计数 MatchCondition = false
我的集合中有超过 190 万个文档,我想查询这些文档。
您可以$map
构造一个辅助布尔数组来检查MatchCondition
是否为假。对于您的情况,一个简单的 $not
将起作用,因为它可以将 false 翻转为 true。然后,使用$anyElementTrue
进行过滤。
db.collection.aggregate([
{
"$match": {
$expr: {
"$anyElementTrue": {
"$map": {
"input": "$ecuCheckResultList.MatchCondition",
"as": "mc",
"in": {
$not: "$$mc"
}
}
}
}
}
}
])
这里是Mongo playground供您参考。
查询 1
- unwind 替换 root 使每个成员成为根文档
- 匹配条件为假
- 按 anima 分组并计数
Playmongo
(对于每个阶段in/out
,您可以将鼠标放在阶段的尽头)
aggregate(
[{"$unwind": "$ecuCheckResultList"},
{"$replaceRoot": {"newRoot": "$ecuCheckResultList"}},
{"$match": {"$expr": {"$eq": ["$MatchCondition", false]}}},
{"$group": {"_id": "$animal", "count": {"$sum": 1}}}])
查询2
- 与上面相同,但首先过滤以仅保留条件 false 并在 之后放松
*可能比之前更快
aggregate(
[{"$set":
{"ecuCheckResultList":
{"$filter":
{"input": "$ecuCheckResultList",
"cond": {"$eq": ["$$this.MatchCondition", false]}}}}},
{"$unwind": "$ecuCheckResultList"},
{"$group": {"_id": "$ecuCheckResultList.animal", "count": {"$sum": 1}}}])