【发布时间】: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,你有什么不同?
标签: mongodb mongoose nosql nosql-aggregation