Mongodb Mongo:$存在于管道$lookup中,未按预期工作
我的两个收藏是:Mongodb Mongo:$存在于管道$lookup中,未按预期工作,mongodb,mongodb-query,nosql,aggregation-framework,Mongodb,Mongodb Query,Nosql,Aggregation Framework,我的两个收藏是: 产品类别 { "_id" : ObjectId("5fca496b61e8a83e5cd0fb01"), "category_id" : "1", ... } 产品 { "_id" : ObjectId("60684610f8f81d0013ce776d"), "primary_parent_catego
产品类别
{
"_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中的存在未正确执行。
感谢您的帮助。提前感谢。正如@turivishal所指出的,您必须在管道参数的
$match
中使用$expr
操作符。无论您在哪里尝试使用$$
引用临时MongoDB变量,都必须执行此操作
{
$match: {
{
$expr: {"$eq": ["$$<VAR-NAME-IN-LET>", "$<FOREIGN-KEY-IN-TARGET-COL>"]}
}
}
}
正如@turivishal所指出的,您必须在管道参数的
$match
中使用$expr
操作符。无论您在哪里尝试使用$$
引用临时MongoDB变量,都必须执行此操作
{
$match: {
{
$expr: {"$eq": ["$$<VAR-NAME-IN-LET>", "$<FOREIGN-KEY-IN-TARGET-COL>"]}
}
}
}
正确的方法是将@hhharsha36和@turivishal提到的结合起来。我必须将$exist的匹配查询移动到$lookup块之后,同时保持变量映射匹配块不变
db.getCollection('product_category').aggregate([
{
"$lookup": {
"from": "product",
"let": { "category_id": "$category_id" },
"pipeline": [
{
"$match": {
"$expr":
{ "$eq": [ "$primary_parent_category", "$$category_id" ] },
}},
{
"$project":{
"child_categories": 0,
"featured_products": 0,
"related_brands": 0,
"child_category_names": 0
}
}
],
"as": "products"
}
},
{ "$match":
{ "products":
{
"$exists": true,
"$ne": [],
}
}
},
])
正确的方法是将@hhharsha36和@turivishal提到的结合起来。我必须将$exist的匹配查询移动到$lookup块之后,同时保持变量映射匹配块不变
db.getCollection('product_category').aggregate([
{
"$lookup": {
"from": "product",
"let": { "category_id": "$category_id" },
"pipeline": [
{
"$match": {
"$expr":
{ "$eq": [ "$primary_parent_category", "$$category_id" ] },
}},
{
"$project":{
"child_categories": 0,
"featured_products": 0,
"related_brands": 0,
"child_category_names": 0
}
}
],
"as": "products"
}
},
{ "$match":
{ "products":
{
"$exists": true,
"$ne": [],
}
}
},
])
查找
管道
中的$match
期望产品
字段存在,我怀疑它是否存在。另外,我没有看到关于category\u id
的比较,您错过了管道中category\u id的匹配条件,{$match:{$expr:{$eq:[“$$category\u id”,“$primary\u parent\u category”]}}
在查找管道中的$match
期望产品字段存在,我怀疑它是否存在。另外,我没有看到关于category\u id
您错过了管道中category\u id的匹配条件,{$match:{$expr:{$eq:[“$$category\u id”,“$primary\u parent\u category”]}}
hharsha36 turivishal sidgate感谢您的回复。我尝试了这个方法,但是它仍然返回很多记录。事实上,这种行为就像第一个查询中省略了匹配语句的localfield和foreignfield。我怀疑这种行为可能是因为sidgate提到了管道阶段中不存在的产品变量。有什么想法吗?有可能。请分享样本输入和预期输出的完整屏蔽版本,以便我能提供帮助。hhharsha36 turivishal sidgate感谢您的回复。我尝试了这个方法,但是它仍然返回很多记录。事实上,这种行为就像第一个查询中省略了匹配语句的localfield和foreignfield。我怀疑这种行为可能是因为sidgate提到了管道阶段中不存在的产品变量。有什么想法吗?有可能。请分享样本输入和预期输出的完整屏蔽版本,以便我能提供帮助。