MongoDB中的数据如下:
id name add
1 x chen
1 x hyd
2 y bang
2 y mum
我需要获取%TMP%\hsperfdata_username
处的数据,这意味着我需要第一条和第四条记录,并过滤出第二条和第三条记录。我该怎么办?
是否有类似于{ "_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 } ] } }
的东西?
答案 0 :(得分:2)
使用 $expr
运算符(在3.6和更高版本中找到)作为find()
方法查询表达式,您可以使用 {{3} } 运算符,该运算符将数组作为集合,如果任何元素为true,则返回true,否则返回false。空数组将返回false。
要根据上面的减法逻辑生成元素为真或假的数组,请使用 $anyElementTrue
遍历count数组并返回评估的逻辑。
下面显示了此操作:
db.getCollection('collection').find(
{
"$expr": {
"$anyElementTrue": [
{ "$map": {
"input": "$data.count",
"as": "count",
"in": {
"$gt": [
{ "$subtract": [ "$$count.f1", "$$count.f2" ] },
0
]
}
} }
]
}
}
)
对于早期版本,您可以按以下方式使用 $map
:
db.getCollection('collection').aggregate([
{
"$redact": {
"$cond": [
{
"$anyElementTrue": [
{ "$map": {
"input": "$data.count",
"as": "count",
"in": {
"$gt": [
{ "$subtract": [ "$$count.f1", "$$count.f2" ] },
0
]
}
} }
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
答案 1 :(得分: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
}
}
}
])
您可以在这里尝试:mongoplayground.net/p/Jp_G6Q0y26Q