如何在MongoDB中减去数组

时间:2018-06-25 11:34:58

标签: mongodb mongodb-query

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 } ] } } 的东西?

2 个答案:

答案 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