$filter 嵌套级别与 $or、$gte、$lte 运算符

2023-12-26

我想过滤 MONGOdb 中的多重嵌套文档

示例 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 10 且members.product_warehouses.available_qty 20 的成员(不是全部)

Query:

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" : {

                                   }
                               }
                            }
                        ]

               }
           }
       }
   }
}])

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


据我了解,这是您需要的查询。

db.col.aggregate([
    {"$unwind" : "$members"},
    {"$match" : {"$and" : [{"members.available_qty" : {"$lt" : 50}},{"members.available_qty" : {"$gt" : 10}}]}},
    {"$match" : {"$and" : [{"members.product_warehouses.available_qty" : {"$lt" : 50}},{"members.product_warehouses.available_qty" : {"$gt" : 20}}]}},
    {"$group" : {"_id" : "$_id",
        "type" : {"$first" : "$type"},
        "name" : {"$first" : "$name"},
        "id" : {"$first" : "$id"},
        "members" : {"$addToSet" : "$members"}
        }
    }
]);

or

db.lo.aggregate([
{"$unwind" : "$members"},
{"$match" : {
    "$and" : [
        {"members.available_qty" : {"$lt" : 50}},
        {"members.available_qty" : {"$gt" : 10}}
        ]
    }
},
{"$match" : { 
    "members.product_warehouses": { 
        "$elemMatch":{ 
            "available_qty": { "$lt": 50 }, 
            "available_qty": { "$gt": 20 }
        } 
    } 
}},
{"$group" : {"_id" : "$_id",
    "type" : {"$first" : "$type"},
    "name" : {"$first" : "$name"},
    "id" : {"$first" : "$id"},
    "members" : {"$addToSet" : "$members"}
    }
}

]);

如果任何一个子文档符合以下条件members.product_warehouses.available_qty > 20 且members.product_warehouses.available_qty 它将返回整个product_warehouses数组,就像$elemMatch

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

$filter 嵌套级别与 $or、$gte、$lte 运算符 的相关文章

随机推荐