文件角色=
{ "_id" = "12345",
Name = "Developer"
},
{ "_id" = "67890",
Name = "Manager"
}
文件员工=
{ "_id" = "00000",
"Name"= "Jack",
"Roles"= [{_id:"12345"},{_id:"67890"}]
}
我想选择一个角色并列出具有相同角色的所有用户 怎么做?
我想得到一些像。
{ "_id" = "12345",
Name = "Developer"
Employees = [{"_id":"00000"}]
}
是否可以使用populate来实现这一目标?
答案 0 :(得分:0)
Mongoose .populate()
以及您可能找到的其他方法并非#34;加入魔法"对于MongoDB。他们实际上所有做的是执行"额外"查询数据库上的操作和"合并"结果"引擎盖"对你而言,而不是你自己做的工作。
所以,只要你可以处理它,你最好的选择是使用"嵌入"这保持了相关的"您所关注的文件中的信息"配对"它,例如" Roles":
{
"_id": "0000",
"name": "Developer",
"employees": [{ "_id": "12345", "name": "Jack" }]
}
这很简单,但当然是由于它自己的成本和处理"嵌入式"条目以及如何根据"更新"或"阅读"如果合适的话。这是一个单一的阅读"操作,但"更新"由于需要更新多个位置的嵌入信息和多个文档,因此可能成本更高。
如果你能"生活"用"参考"它会带来成本,你可以随时做到这一点:
var rolesSchema = Schema({
"name": String,
"emloyees": [{ "type": Schema.Types.ObjectId, "ref": "Employee" }]
});
var employeesSchema = Schema({
"name": String,
"roles": [{ "type": Schema.Types.ObjectId, "ref": "Role" }]
});
var Role = mongoose.model(' Role',rolesSchema); var Employee = mongoose.model(' Employee',employeeSchema);
Role.find({" _id":" 12345"})。populate(" employees")。exec(function(err,docs){ //填充"加入"结果在这里 })
这背后的效果是有效的(基本的JavaScript表示和"充其量"):
var roles = db.role.find({ "_id": "12345" }).map(function(doc) {
doc.employees = doc.employees.map(function(employee) {
return db.employees.find({ "_id": { "$in": doc.employees } }).toArray();
})
})
Mongoose致力于使用" schema"定义为"知道"哪个集合执行"其他查询"然后返回"加入"结果给你。但是不单个查询,但多次点击数据库。
其他方案可能"保持"文档本身中引用的集合信息,而不是依赖于"模型代码"获取这些信息。但同样的原则适用于需要再次调用数据库并执行某种类型的" merge"在提供的API中。
所以这一切都归结为你的选择。无论你是"嵌入"数据并以该成本为生,或者您参考"数据并与网络共存"成本"与多个数据库命中相关联。
这里的关键点是"没有什么是免费的,而且甚至不是SQL RDBMS执行的方式"加入"还有一个"成本"它拥有的NoSQL解决方案就像MongoDB这样做的原因很多,而且#34;不支持连接"以本地方式购买"成本"参与分布式数据系统。
这里的主要教训是“做什么适合你和你的应用程序"”,而不仅仅是选择现在最酷的东西",但基本上期望你从选择不同的东西存储方案。他们都有自己的目的。正如俗话说的那样,马术课程。