Node.js MongoDB正在返回所有字段,而不是匹配的字段
我正试图与MongoDB一起加入2个系列。不管我怎么想,它都不起作用。。这就是我现在拥有的: 正在尝试加入这两个集合Node.js MongoDB正在返回所有字段,而不是匹配的字段,node.js,mongodb,Node.js,Mongodb,我正试图与MongoDB一起加入2个系列。不管我怎么想,它都不起作用。。这就是我现在拥有的: 正在尝试加入这两个集合 //Group collection _id:ObjectId(5fa2d687c59139213cf8c081) groupname: : chatting //Peoplegroups collection _id:5fa2d687c59139213cf8c082 groupid:5fa2d687c59139213cf8c081 user:PNZT4lvwQZPCWql6r
//Group collection
_id:ObjectId(5fa2d687c59139213cf8c081)
groupname: : chatting
//Peoplegroups collection
_id:5fa2d687c59139213cf8c082
groupid:5fa2d687c59139213cf8c081
user:PNZT4lvwQZPCWql6rWVEJHjt6Pe2
使用此nodejs代码,我尝试获取查询:
app.get("/groups/sync", (req, res) => {
db.collection("groups")
.aggregate([
{
$lookup: {
from: "peoplegroups",
localField: "groups_id",
foreignField: "groupid",
as: "User",
},
},
])
.toArray(function (err, data) {
if (err) throw res.status(500).send(err);
res.status(201).send(data);
});
});
输出:
[
{
"_id": "5fa2d687c59139213cf8c082",
"groupid": "5fa2d687c59139213cf8c081",
"user": "PNZT4lvwQZPCWql6rWVEJHjt6Pe2",
"__v": 0,
"User": [
{
"_id": "5fa2d687c59139213cf8c081",
"groupname": "rsr",
"__v": 0
},
{
"_id": "5fa2d689c59139213cf8c083",
"groupname": "rsrs",
"__v": 0
},
{
"_id": "5fa2d68ac59139213cf8c085",
"groupname": "easa",
"__v": 0
}
]
},
如您所见,它返回所有peoplegroups字段,而不是与组id匹配的groupid。有什么问题吗?首先,
$lookup
的本地字段不正确。按照您的模式应该是\u id
,而不是组\u id
第二件事是,你想加入什么
知道一个\u id
获取所有人员组
哪个组id
等于\u id
?
或者只按相同的groupid
对您的人员组进行分组
要获得第一个,您需要在$lookup
之前有一个$match
阶段,如下所示:
db.group.aggregate([
{
“$match”:{
“_id”:1
}
},
{
“$lookup”:{
“from”:“peoplegroups”,
“localField”:“\u id”,
“foreignField”:“groupid”,
“作为”:“用户”
}
}
])
这样,您将获得groupid
等于1
的所有用户
范例
但是,第二个选项(在查询之后)将对不同的用户进行分组。查看此项了解其工作原理。localField:“groups\u id”
是localField:“\u id”
。但是,它们也必须是相同的类型。检查它们是否在地图册或指南针中。谢谢您的回答。第二个例子正是我想要实现的(将groupid与集合“group”中的_id进行匹配),但是当我完全尝试您所做的事情时,它不起作用。这是因为groupid是字符串而_id是ObjectID吗?是的,这是可能的。尝试将模式中的groupid
设置为ObjectId
.Jep,这就是问题所在。。Pfff。。。非常感谢你的帮助。不客气!此外,如果答案解决了你的问题,请将其标记为已接受并表示感谢