我在下面有一个汇总查询。我将不得不过滤掉产品集合上的聚合结果,因为对于某些客户来说,有大量的产品并且在没有过滤器的情况下(在单个聚合查询中)获取所有客户的产品会导致 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"
}
]
}
任何想法或替代方案??