【发布时间】:2021-07-29 15:35:02
【问题描述】:
我的两个系列是:
产品类别
{
"_id" : ObjectId("5fca496b61e8a83e5cd0fb01"),
"category_id" : "1",
...
}
产品
{
"_id" : ObjectId("60684610f8f81d0013ce776d"),
"primary_parent_category" : "1653",
...
}
在$lookup中使用localfield和foreignfield,可以达到预期的效果。
db.getCollection('product_category').aggregate([
{
"$lookup": {
"from": "product",
"localField": "category_id",
"foreignField": "primary_parent_category",
"as": "products"
}
},
// { "$match": { "products": { $exists: true, $not: { $size: 0 } } }},
{ "$match": { "products": { $exists: true, $ne: [] } }},
{
"$project":{
"child_categories": 0,
"featured_products": 0,
"related_brands": 0,
"child_category_names": 0
}
}
])
以上工作正常,但我必须在 $lookup 中使用管道模型来处理另一个用例(用于添加 $geoNear)。聚合查询如下。
db.getCollection('product_category').aggregate([
{
"$lookup": {
"from": "product",
"let": { "category_id": "$category_id" },
"pipeline": [
{ "$match": { "product": { $exists: true, $ne: [] } }},
{
"$project":{
"child_categories": 0,
"featured_products": 0,
"related_brands": 0,
"child_category_names": 0
}
}
],
"as": "products"
}
}
])
这没有按预期工作并返回大量条目。 $match 中的 $exists 未正确执行。 任何帮助表示赞赏。提前致谢。
【问题讨论】:
-
lookup中的$matchpipeline期望product字段存在,我怀疑它存在。另外,我看不到category_id的比较 -
您错过了管道中 category_id 的匹配条件,
{ $match: { $expr: { $eq: ["$$category_id", "$primary_parent_category"] } } }
标签: mongodb mongodb-query nosql aggregation-framework