聚合管道中的设置条件在mongodb中不起作用



我有两个集合,如下所示:

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参数与Memberscollection中的group_id进行比较来检查与该电子邮件关联的用户是否属于特定组。

例如,如果传递的搜索参数为: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": []
}
]

我希望这个问题有道理。

我从第一个线程和第二个线程中遵循了类似的解决方案,但这些似乎都不适用于我

以下是我迄今为止所尝试的:

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"
}
}
])

任何帮助或指导都将不胜感激。提前感谢!

我遵循了@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"
}
},
]);

第一个问题是,当我简单地比较一个包含Id而不是数组的字段时,我在$expr中使用了$in运算符我将其更改为$eq

其次,我只是比较expr中的group_id变量(字符串类型(因此,我用ObjectId(group_id(替换了它,它对我有效。此外,不要忘记在开始时导入ObjectId(即var ObjectId=require('mongdb'(。ObjectID(

相关内容

  • 没有找到相关文章

最新更新