查找中的管道不起作用

时间:2018-07-03 14:48:45

标签: mongodb mongoose

我是mongodb的新手,所以我希望这不会成为一个非常基本的问题。我已经进行了一些研究,并尝试应用所发现的内容,但似乎有些东西无法逃脱。

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

-----------------------------------------------------------------------
Shop
-----------------------------------------------------------------------
{
    "shopId": "1002",
    "shopPosId": "10002",
    "description": "some description"
}

-----------------------------------------------------------------------
Compte
-----------------------------------------------------------------------
{
    "shopId": "9000",
    "shopPosId": "0000",
    "clientUid": "474192"
}

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

这是我的代码:

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"}是否应该处理?)

1 个答案:

答案 0 :(得分:0)

正如Alex所评论的,您在这里混合使用 $lookup语法...因此正确的方法是

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