如何在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" : [

MongoDB中的数据如下所示:

{ "_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"
            ]
        }
    }
])