$ filter与$ or,$ gte,$ lte运算符的嵌套级别 [英] $filter nested level with $or, $gte, $lte operators

查看:93
本文介绍了$ filter与$ or,$ gte,$ lte运算符的嵌套级别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想过滤MONGO db中的多个嵌套文档

I want to filter multi nested documents in MONGO db

示例JSON:

{ 
"_id" : ObjectId("5b5c3afbcc43cb5ed64b7a04"), 
"id" : NumberLong(15015060), 
"name" : "1801_Conf", 
"type" : NumberInt(2), 
"members" : [
    {
        "id" : NumberLong(15015061), 
        "name" : "1801_Conf-W--", 
        "sku" : "1801_new", 
        "type" : NumberInt(1), 
        "parent_id" : NumberLong(15015060), 
        "available_qty" : NumberInt(10), 
        "on_hand_qty" : NumberInt(10), 
        "outgoing_qty" : NumberInt(0), 
        "incoming_qty" : NumberInt(0), 
        "shortage_qty" : NumberInt(0), 
        "product_warehouses" : [
            {
                "warehouse_id" : NumberLong(3), 
                "available_qty" : NumberInt(10), 
                "outgoing_qty" : NumberInt(0), 
                "incoming_qty" : NumberInt(0)
            },
            {
                "warehouse_id" : NumberLong(4), 
                "available_qty" : NumberInt(600), 
                "outgoing_qty" : NumberInt(0), 
                "incoming_qty" : NumberInt(0)
            }
        ], 
        ]
    } 
] 

}

预期的输出:仅过滤具有available_qty<50和> 10,以及members.product_warehouses.available_qty<50和> 20

Expected Output: Want to filter only members (not all) that have available_qty < 50 and > 10 and members.product_warehouses.available_qty < 50 and > 20

查询:

db.products.aggregate([{
   "$match": {
       "tenant_id": XXX,
       "type" : 2
   }
}, {
   "$project": {
       "name": 1,
       "sku": 1,
       "members": {
           "$filter": {
               "input": "$members",
               "as": "member",
               "cond": {

                       "$and": 
                        [
                            {
                               "$gte": ["$$member.product_warehouses.available_qty", 10]
                            }, 
                            {
                               "$lte": ["$$member.available_qty", 50]
                            },
                            {
                               "product_warehouses": {
                               "$elemMatch" : {

                                   }
                               }
                            }
                        ]

               }
           }
       }
   }
}])

错误::{"ok":0,"errmsg":无效的运算符'$ elemMatch'","code":15999}:聚合失败

Error: : { "ok" : 0, "errmsg" : "invalid operator '$elemMatch'", "code" : 15999 } : aggregate failed

推荐答案

您需要先 $ map 聚合.

You need to first $filter the members array and at the same time you have to apply $filter to the product_warehouses array with looping over the filtered members array using $map aggregation.

最后,您需要使用 $ gt

And last you need to put the cond with $and, $gt and $eq aggregation operator which is same as your Expected Output condition.

db.collection.aggregate([
  { "$project": {
    "members": {
      "$filter": {
        "input": {
          "$map": {
            "input": "$members",
            "as": "member",
            "in": {
              "$mergeObjects": [
                "$$member",
                { "product_warehouses": {
                  "$filter": {
                    "input": "$$member.product_warehouses",
                    "as": "product",
                    "cond": {
                      "$or": [
                        { "$lt": ["$$product.available_qty", 50] },
                        { "$gt": ["$$product.available_qty", 20] }
                      ]
                    }
                  }
                }}
              ]
            }
          }
        },
        "as": "member",
        "cond": {
          "$or": [
            { "$lte": [ "$$member.available_qty", 50 ] },
            { "$gte": [ "$$member.available_qty", 10 ] }
          ]
        }
      }
    }
  }},
  { "$match": { "members": { "$ne": [] } } }
])

给它尝试

这篇关于$ filter与$ or,$ gte,$ lte运算符的嵌套级别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆