如何在MongoDB中减去数组
MongoDB中的数据如下所示:如何在MongoDB中减去数组,mongodb,mongodb-query,Mongodb,Mongodb Query,MongoDB中的数据如下所示: { "_id" : ObjectId("5b30d15d1e8b07d6a659ea81"), "group" : "2", "data" : { "count" : [ { "f1" : 56, "f2" : 48 }, { "f1" : 95, "f2" : 6 } ] } } { "_id" : ObjectId("5b30d1671e8b07d6a659ea82"), "group" : "3", "data" : { "count" : [
{ "_id" : ObjectId("5b30d15d1e8b07d6a659ea81"), "group" : "2", "data" : { "count" : [ { "f1" : 56, "f2" : 48 }, { "f1" : 95, "f2" : 6 } ] } }
{ "_id" : ObjectId("5b30d1671e8b07d6a659ea82"), "group" : "3", "data" : { "count" : [ { "f1" : 15, "f2" : 72 }, { "f1" : 56, "f2" : 74 } ] } }
{ "_id" : ObjectId("5b30d1731e8b07d6a659ea83"), "group" : "4", "data" : { "count" : [ { "f1" : 12, "f2" : 96 }, { "f1" : 85, "f2" : 85 } ] } }
{ "_id" : ObjectId("5b30d17c1e8b07d6a659ea84"), "group" : "5", "data" : { "count" : [ { "f1" : 73, "f2" : 56 }, { "f1" : 96, "f2" : 79 } ] } }
我需要在f1-f2>0
的位置获取数据,这意味着我需要第一个和第四个记录,并过滤掉第二个和第三个记录。我该怎么做
是否有类似于
db.events.find({“$and”:[{“difference”:{“$subtract”:{“data.count.f1”:“data.count.f2”}}}}},{“difference”:{“$gt”:0}}}}})
?您需要为此使用聚合,因为$subtract
只能在$project
阶段中使用
以下是聚合查询:
db.collection.aggregate([
{
"$unwind": "$data.count"
},
{
"$project": {
"group": 1,
"data": 1,
"diff": {
"$subtract": [
"$data.count.f1",
"$data.count.f2"
]
}
}
},
{
"$match": {
"diff": {
"$gt": 0
}
}
}
])
您可以在这里尝试:使用操作符(在3.6和更高版本中找到)作为find()
方法查询表达式,您可以使用操作符,该操作符将数组作为一个集合,如果任何元素为true,则返回true,否则返回false。空数组返回false
要生成包含基于上述减法逻辑计算为true或false的元素的数组,请使用迭代计数数组并返回计算的逻辑
下面显示了这一点:
db.getCollection('collection').find(
{
"$expr": {
"$anyElementTrue": [
{ "$map": {
"input": "$data.count",
"as": "count",
"in": {
"$gt": [
{ "$subtract": [ "$$count.f1", "$$count.f2" ] },
0
]
}
} }
]
}
}
)
对于早期版本,您可以使用,如下所示:
db.getCollection('collection').aggregate([
{
"$redact": {
"$cond": [
{
"$anyElementTrue": [
{ "$map": {
"input": "$data.count",
"as": "count",
"in": {
"$gt": [
{ "$subtract": [ "$$count.f1", "$$count.f2" ] },
0
]
}
} }
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])