MongoDB使用附加信息查询引用
我将组织的数据存储在以下文档结构中:MongoDB使用附加信息查询引用,mongodb,Mongodb,我将组织的数据存储在以下文档结构中: { "_id":ObjectId("52ffc33cd85242f436000001"), "name": "NASA", "users" : [ { "_id" : ObjectId("5629f0b20fe85c57ed459913"), "level" : "organization_lead" }, {
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "NASA",
"users" : [
{
"_id" : ObjectId("5629f0b20fe85c57ed459913"),
"level" : "organization_lead"
},
{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"level" : "team_member"
}
]
}
用户位于另一个集合中,如下所示:
{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"email" : "bob@email.com",
"firstname" : "Bob",
"lastname" : "Green",
}
获取属于特定组织的用户文档列表的最有效方法是什么
如果用户数组中只有_id,我会将该数组传递给另一个查询以获取用户,但是在这种情况下我应该怎么做?或者有没有更好的方法来获取包含附加信息的引用?使用组织集合的光标的方法来迭代、访问循环中的文档并调用方法来获取每个用户id的完整用户文档,如以下示例所示:
db.organisation.find({ "name": "NASA", "users.0": { "$exists": true } }).forEach(function(doc){
var updatedUsers = doc.users.map(function(u){
var user = db.users.findOne({"_id": u._id});
user["level"] = u.level;
return user;
}
doc.users = updatedUsers;
printjson(doc);
})
使用组织集合的光标的方法进行迭代,访问循环中的文档,并调用方法以获取每个用户id的完整用户文档,如下例所示:
db.organisation.find({ "name": "NASA", "users.0": { "$exists": true } }).forEach(function(doc){
var updatedUsers = doc.users.map(function(u){
var user = db.users.findOne({"_id": u._id});
user["level"] = u.level;
return user;
}
doc.users = updatedUsers;
printjson(doc);
})
使用填充
db.organisation.findOne({ "name": "NASA"}, function(err, response) {
db.Users.populate(response.user, {'path': _id, 'select': 'firstname lastname email'}, function(err, populatedUserData) {
console.log(populatedUserData);
});
});
产量将是,
[{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "NASA",
"users" : [
{
"_id" : [{
"_id" : ObjectId("5629f0b20fe85c57ed459913"),,
"email" : "laurem@email.com",
"firstname" : "laurem",
"lastname" : "Ipsum"
}],
"level" : "organization_lead"
},
{
"_id" : [{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"email" : "bob@email.com",
"firstname" : "Bob",
"lastname" : "Green"
}],
"level" : "team_member"
}
]}]
使用填充
db.organisation.findOne({ "name": "NASA"}, function(err, response) {
db.Users.populate(response.user, {'path': _id, 'select': 'firstname lastname email'}, function(err, populatedUserData) {
console.log(populatedUserData);
});
});
产量将是,
[{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "NASA",
"users" : [
{
"_id" : [{
"_id" : ObjectId("5629f0b20fe85c57ed459913"),,
"email" : "laurem@email.com",
"firstname" : "laurem",
"lastname" : "Ipsum"
}],
"level" : "organization_lead"
},
{
"_id" : [{
"_id" : ObjectId("5629ff550fe85c57ed459914"),
"email" : "bob@email.com",
"firstname" : "Bob",
"lastname" : "Green"
}],
"level" : "team_member"
}
]}]
你可以,或者。如果没有“嵌入”(非规范化),您必须执行第二个查询来查找用户;您可以通过构建一个要搜索的用户ID数组,然后:
{$in:userIDArray}
其中userIDArray=[ObjectId(“…”)、ObjectId(“…”)、…]
。您在“users”集合中的文档是什么样子的?预期的结果是什么?请使用添加到您的问题的来添加这些信息。我添加了用户集合文档结构。您可以,或。如果没有“嵌入”(非规范化),您必须执行第二个查询来查找用户;您可以通过构建一个要搜索的用户ID数组,然后:{$in:userIDArray}
其中userIDArray=[ObjectId(“…”)、ObjectId(“…”)、…]
。您在“users”集合中的文档是什么样子的?预期的结果是什么?请使用添加到您的问题的来添加这些信息。我添加了用户集合文档结构。由于操作员的工作方式,您的第一次查询将不会返回任何文档。我看到您编辑了您的帖子,但这并没有使事情变得更好。你不应该在哪里使用$where
我想你知道为什么。使用点表示法代替“users.0”:{“$exists”:true}
。但是我不清楚这个问题,因为我不知道预期的结果。@user3100115谢谢你的更正。如果OP有足够的信息来消除猜测,我会很有帮助。不过我很感谢你的输入。由于操作员的工作方式,你的第一次查询不会返回任何文档。我看到你编辑了你的帖子,但这并没有让事情变得更好。你不应该在哪里使用$where
我想你知道为什么。使用点表示法代替“users.0”:{“$exists”:true}
。但是我不清楚这个问题,因为我不知道预期的结果。@user3100115谢谢你的更正。如果OP有足够的信息来消除猜测,我会很有帮助的。不过,我很感谢你的意见。