$eq 内部过滤器不适用于数组字段 - Mongodb

我在下面有一个汇总查询。我将不得不过滤掉产品集合上的聚合结果,因为对于某些客户来说,有大量的产品并且在没有过滤器的情况下(在单个聚合查询中)获取所有客户的产品会导致 Bson too large 异常。 问题是我要执行过滤器的字段之一是数组 (p.metadata.category) 并且 Mongo $eg 似乎不适用于数组字段,它似乎只适用于简单值和对象字段。

db.getcollection('customer').aggregate([

{
    $lookup: {
            from: 'Product',localField: '_id',foreignField: 'partiesList._id',as: 'products',}
},{
    $match: {
        "_id": {$in: [
                "C123","C456"
            ]
        }
    }
},{
    "$project": {
        "products": {
            "$filter": {
                "input": "$products","as": "p","cond": {
                    $and:[
                        {
                            "$eq": ["$$p.metadata.category.name","somevalue"]
                        },{
                            "$eq": ["$$p.isMain",true]
                        }
                    ]
                }
            }
        }
    }
 }
])

因此上述查询的结果将是具有空产品数组的客户列表(尽管产品实际上存在)但是如果我从上面查询中的 $and 数组中删除 metadata.category.name 条件,它的工作原理就像魅力和 p.isMain 过滤器工作正常并按预期过滤产品,仅显示 isMain 设置为 true 的产品。

这是我的示例数据:

客户:

{
  "_id" : "C123","name" : "coooo"
 }

产品(客户的产品):

{
"_id" : "PR123","isMain" : true,"name" : "My Product","metadata" : {
    "category" : [ 
        {
            "name" : "somevalue","version" : "1","referredType" : "Category","type" : "Category"
        },{
            "name" : "someOtherValue","type" : "Category"
        }
    ]
},"partiesList" : [ 
    {
        "_id" : "C123","role" : "Customer"
        "referredType" : "Customer"
    }
 ]
}

任何想法或替代方案??

lts0129 回答:$eq 内部过滤器不适用于数组字段 - Mongodb

由于 Product.metadata.category 是一个数组,"$$p.metadata.category.name" 是每个元素中所有 name 值的数组。

那个 $eq 然后正在测试 ["somevalue","someOtherValue"] == "somevalue",它总是会是假的。

要检查某个值是否包含在数组中,请使用 $in,例如

{$in: ["somevalue","$$p.metadata.category.name"]}

无关的性能说明: 由于 match 语句正在考虑来自输入集合的文档的 _id,因此将 $match 放在管道中的 $lookup 之前将导致查找期间检索的文档更少,从而提高性能。>

本文链接:https://www.f2er.com/1703.html

大家都在问