查找聚合中的管道在 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
字段的Shop
s。
这是我的代码:
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-as
或from-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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章