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

代码_蠕虫

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

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]
                        }
                    ]
                }
            }
        }
    }
 }
])

因此,上述查询的结果将是具有空产品数组的客户列表(尽管产品实际上存在)但是如果我metadata.category.name从上面查询中的 $and 数组中删除条件,它就像魅力一样工作,并且 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",
            "version" : "1",
            "referredType" : "Category",
            "type" : "Category"
        }
    ]
},
"partiesList" : [ 
    {
        "_id" : "C123",
        "role" : "Customer"
        "referredType" : "Customer"
    }
 ]
}

任何想法或替代方案?

因为Product.metadata.category是一个数组,所以"$$p.metadata.category.name"name每个元素中所有的数组

$eq就是测试["somevalue", "someOtherValue"] == "somevalue",它总是会是假的。

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

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

性能无关注:由于匹配语句正在考虑从输入采集文档的_id,放置$match$lookup的管道将导致查找期间检索比较少的文件,并因此更快的性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章