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提到了管道阶段中不存在的产品变量。有什么想法吗?有可能。请分享样本输入和预期输出的完整屏蔽版本,以便我能提供帮助。