查找聚合中的管道在 mongodb 中不起作用

Posted

技术标签:

【中文标题】查找聚合中的管道在 mongodb 中不起作用【英文标题】:Pipeline in lookup aggregation not working in mongodb 【发布时间】:2018-12-11 22:30:49 【问题描述】:

我是 mongodb 的新手,所以我希望这不会成为一个非常基本的问题。我做了一些研究并试图应用我发现的东西,但似乎有些东西让我无法理解。

我有两个以下格式的集合:

-----------------------------------------------------------------------
Shop
-----------------------------------------------------------------------

    "shopId": "1002",
    "shopPosId": "10002",
    "description": "some description"


-----------------------------------------------------------------------
Compte
-----------------------------------------------------------------------

    "shopId": "9000",
    "shopPosId": "0000",
    "clientUid": "474192"

我想加入这些,在加入之前,我想过滤掉没有shopPosId 字段的Shops。

这是我的代码:

Compte.aggregate([
    
        $match:
             
                $and:["clientUid":clientUid]
            
    ,
          
        $lookup:
        
            from: "Shop",
            localField: "shopId",
            foreignField: "shopId",
            let: "Shop.shopPosId": "$shopPosId",
            pipeline: [$match: "shopPosId": "$exists": false],
            as: "shopDescr"
        
        ]
);

返回的结果是undefined,这意味着查询没有多大意义(因为实际上我至少应该得到一个空数组)。

这是因为这两个集合都有shopPosId 字段吗? (如果是这样,这条线let: "Shop.shopPosId": "$shopPosId" 不应该照顾它吗?)

【问题讨论】:

clientUid 在你的数据库中吗? 是的,只是打字错误,我编辑了帖子,对不起! 您正在混合$lookup 语法。它是from-localField-foreignField-asfrom-let-pipeline-as,但不能同时使用。 【参考方案1】:

正如亚历克斯所说,你在这里混合了 $lookup 语法......所以正确的是

Compte.aggregate([
   "$match":  "$and": [ "clientUid": clientUid ] ,
   "$lookup": 
    "from": "Shop",
    "let":  "shopId": "$shopId" ,
    "pipeline": [
       "$match": 
        "$expr":  "$eq": [ "$shopId", "$$shopId" ] ,
        "shopPosId":  "$exists": false 
      
    ],
    "as": "shopDescr"
  
])

【讨论】:

好的,这是信息,谢谢!尽管如此,我还是得到了undefined 结果,我认为这与我的数据有关,但我真的不这么认为。是否需要 mongoDB 3.6 才能在查找中应用管道? 是的,好像是这样,在官方文档中确认:docs.mongodb.com/manual/reference/operator/aggregation/lookup/…

以上是关于查找聚合中的管道在 mongodb 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在聚合管道中设置条件在 mongodb 中不起作用

C ++写入mongo,字符串字段在聚合管道中不起作用

日期范围在聚合管道中不起作用,但在 find() 中起作用

$lookup 在 mongodb 聚合中不起作用

按 ID 查找在 Nodejs MongoDB 中不起作用 [重复]

按 ID 查找在 Nodejs MongoDB 中不起作用 [重复]