当前位置: 首页 > 知识库问答 >
问题:

mongo:$存在于管道$查找中,未按预期工作

潘坚白
2023-03-14

我的两个系列是:

产品类别

{
    "_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
    }
    }
])

上面的工作正常,但我必须将$look kup中的管道模型用于另一个用例(用于添加$Geo近)。聚合查询如下所示。

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没有得到正确执行。任何帮助,不胜感激。提前谢谢。

共有2个答案

淳于功
2023-03-14

正确的方法是@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": [],
      } 
      } 
   },
])
翁心思
2023-03-14

正如@turivishal所指出的,您必须在管道参数中的$match中使用$expr运算符。无论您试图使用$$引用临时MongoDB变量,都必须这样做。

{
  $match: {
    {
      $expr: {"$eq": ["$$<VAR-NAME-IN-LET>", "$<FOREIGN-KEY-IN-TARGET-COL>"]}
    }
  }
}
db.getCollection('product_category').aggregate([
  {
    "$lookup": {
      "from": "product",
      "let": { "category_id": "$category_id" },
      "pipeline": [
        {
          "$match": {
            "$expr": {
              { $eq: [ "$primary_parent_category",  "$$category_id" ] },
            }
            "product": { 
              $exists: true,
              $ne: [],
            },
          }
        },      
        {
          "$project":{
              "child_categories": 0,
              "featured_products": 0,
              "related_brands": 0,
              "child_category_names": 0
          }
        }
      ],
      "as": "products"
    }
  }
])
 类似资料:
  • 以下带有卷装载的代码段在$JENKINS\u主页/工作区下创建maven依赖项/ 请注意,settings.xml镜像到我们的内部存储库。关于如何挂载的说明直接取自jenkins.io 有人知道为什么会这样吗? 这并不像在单机版中使用Docker那么简单。我已经创建了/var/jenkins/。Jenkins slave上运行构建的m2目录。确保新目录具有775权限(尽管这可能不是必需的),并将所

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括:

  • 我正在和selenium一起工作,刮一些数据。 有一个按钮在页面上,我正在点击说“Custom_Cols”。这个按钮为我打开了一个窗口,我可以在那里选择我的列。 我的问题是为什么新窗口上的元素不可见,即使我正在等待元素的可见。补充一下,我已经尝试增加延迟时间,但我还是会偶尔出现这个错误。 我的密码在这里