在聚合管道中设置条件在 mongodb 中不起作用
Posted
技术标签:
【中文标题】在聚合管道中设置条件在 mongodb 中不起作用【英文标题】:Setting condition in aggregate pipeline not working in mongodb 【发布时间】:2020-11-01 12:23:04 【问题描述】:我有两个集合如下:
Users:
_id | email
ObjectId("5ee493b0989d0f271cdc41c1") | joulie@gmail.com
ObjectId("5ee493b0989d0f271cdc41c3") | newelle@gmail.com
ObjectId("5ee493b0989d0f271cdc41c5") | john@gmail.com
ObjectId("5ee493b0989d0f271cdc41c7") | larry@gmail.com
Members:
group_id | user_id
ObjectId("5ee5e346fae4a21e28a81d91") | ObjectId("5ee493b0989d0f271cdc41c1")
ObjectId("5ee5e346fae4a21e28a81d92") | ObjectId("5ee493b0989d0f271cdc41c5")
我正在尝试在 Users 集合中搜索电子邮件,并通过将提供的 group_id 参数与 Members 收藏。
例如,如果传递的搜索参数是:email:joulie,group_id:5ee5e346fae4a21e28a81d91
Expected Output:
[
"email":"joulie@gmail.com",
"member_info": [
"group_id":"5ee5e346fae4a21e28a81d91", "user_id":"5ee493b0989d0f271cdc41c1"
]
]
例如,如果传递的搜索参数是:email:newelle,group_id:5ee5e346fae4a21e28a81d91
Expected Output:
[
"email":"newelle@gmail.com",
"member_info": []
]
我希望这个问题有意义。
我从 this first one 和 this second one 线程中遵循了类似的解决方案,但这些似乎都不适合我。
这是我迄今为止尝试过的:
db.users.aggregate([
"$match" : email: $regex: email +'.*',
$lookup:
from: "members",
let: user_id: "$_id" ,
pipeline: [
$match:
$expr: $and:
[
$in: [ group_id, "$group_id" ] ,
$eq: [ "$$user_id", "$user_id" ]
]
],
as: "members"
])
任何帮助或指南将不胜感激。提前致谢!
【问题讨论】:
您目前得到的输出是什么样的? 你传入的 group_id 和文档中的 group_id 都不是数组,所以$in
操作符很可能失败了。
@MontgomeryWatts 我目前遇到错误
你是对的@Joe 我没有意识到这一点。但是,用 $eq 替换 $in 后,当有匹配的行时,仍然会为 members 字段提供空数组 []。我错过了什么吗?
它对我有用:mongoplayground.net/p/Ta8zpo60SDT,你有什么不同?
【参考方案1】:
我已按照@Joe 在评论部分指出的说明进行操作,它对我有用。如果有人仍然遇到类似的问题,那么您可以使用以下更新的查询:
db.users.aggregate([
"$match":
email:
$regex: email +'.*'
,
$lookup:
from: "members",
let:
user_id: "$_id"
,
pipeline: [
$match:
$expr:
$and: [
$eq: [
ObjectId(group_id),
"$group_id"
]
,
$eq: [
"$$user_id",
"$user_id"
]
]
],
as: "members"
,
]);
第一个问题是我在 $expr 中使用了 $in 运算符,当时我只是比较一个包含 Id 的字段而不是一个数组。 我把它改成了 $eq。
其次,我只是在 expr 中比较 group_id 变量(字符串类型)。 因此,我用 ObjectId(group_id) 替换了它,它对我有用。另外,不要忘记在开头导入ObjectId(即var ObjectId = require('mongodb').ObjectID)
【讨论】:
以上是关于在聚合管道中设置条件在 mongodb 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章