mongodb 管道 $lookup 中的 $in/$eq 不起作用
Posted
技术标签:
【中文标题】mongodb 管道 $lookup 中的 $in/$eq 不起作用【英文标题】:$in/$eq in mongo pipeline $lookup is not working 【发布时间】:2021-04-27 14:03:26 【问题描述】:我有一个集合details
,在quotes_id
上有一个字符串值数组,如下所示
"quantity": 2000,
"quotes_id": ["SQ-CPQ10037"],
"status": "processed",
"logs": [""],
"product_id": "5ff5cf3dc1ceb9144901da81"
还有我的quotes
收藏
"_id":"SQ-CPQ10037",
"product_id":"5ff5cf3dc1ceb9144901da81",
...more fields here
现在,我正在尝试使用如下查找管道从另一个名为 quotes
的集合中访问此集合
$lookup:
from: "details",
"let": "product_id": "$quotes.product_id", "quotes_id": "$quotes._id",
pipeline: [
$match:
$expr:
$and: [
$in: [ "$quotes_id", ["$$quotes_id"] ] ,
$eq: [ "$product_id", "$$product_id" ] ,
]
],
as: "product.productquotes",
,
这是返回空集合。但是,如果我评论该行
$in: [ "$quotes_id", ["$$quotes_id"] ] ,
然后它会将记录返回给我。我还尝试使用简单的$eq
来处理quotes_id
,但结果相同。但是如果我直接运行查询就像
$and: ["product_id": ObjectId('5ff5cf3dc1ceb9144901da81'), "quotes_id": "SQ-CPQ10037"]
在 mongo compass 上,我收到记录没有任何问题。
【问题讨论】:
你为什么用[ ]
的$$quote_id
包装? $quotes
是一个对象吗?
因为,我用过$in。我尝试使用不带数组括号的 $eq 。结果相同。
【参考方案1】:
你做的几乎是正确的。但是错误地写了$in
args。 in 的第二个参数应该是一个数组。
$in: [
"$$quotes_id",
"$quotes_id"
]
所以查找喜欢
db.quotes.aggregate([
$lookup:
from: "details",
"let": "product_id": "$product_id", "quotes_id": "$_id" ,
pipeline: [
$match:
$expr:
$and: [
$in: [ "$$quotes_id", "$quotes_id" ] ,
$eq: [ "$product_id", "$$product_id" ]
]
],
as: "product.productquotes"
])
工作Mongo playground
【讨论】:
以上是关于mongodb 管道 $lookup 中的 $in/$eq 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 $lookup 和 let 和管道在 MongoDB 中声明变量