聚合管道中的设置条件在 mongodb 中不起作用
Setting condition in aggregate pipeline not working in 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 检查与该电子邮件关联的用户是否属于特定组Members 集合中 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": []
}
]
我希望这个问题有道理。
我遵循了 and 个线程的类似解决方案,但其中 none 个似乎对我有用。
这是我到目前为止尝试过的方法:
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"
}
},
]);
第一个问题是我在 $expr 中使用了 $in 运算符,当时我只是比较一个包含 Id 而不是数组的字段。 我改成了$eq。
其次,我只是比较 expr 中的 group_id 变量(字符串类型)。 因此,我将其替换为 ObjectId(group_id),它对我有用。另外,不要忘记在开头导入 ObjectId(即 var ObjectId = require('mongodb').ObjectID)
我有两个合集如下:
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 集合中 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"
}
},
]);
第一个问题是我在 $expr 中使用了 $in 运算符,当时我只是比较一个包含 Id 而不是数组的字段。 我改成了$eq。
其次,我只是比较 expr 中的 group_id 变量(字符串类型)。 因此,我将其替换为 ObjectId(group_id),它对我有用。另外,不要忘记在开头导入 ObjectId(即 var ObjectId = require('mongodb').ObjectID)