我正在尝试对两个集合进行连接/合并,根据Stack Overflow上的以下帖子:How do I perform the SQL Join equivalent in MongoDB?
用户:Orlando Becerra
我知道MongoDB是非关系型的,因为V3.2有一些但能力有限的能力。
你能告诉我是否有可能做我正在尝试的事情(例如,我走在正确的道路上),或者如果不可能......或者其他方法最好?
以下是我的收藏:分配
{
"_id" : ObjectId("58a65c082c5fc49016c6a3cd"),
"data" : [
{
"version" : 0,
"jobTaskId" : {
"id" : 16089453
},
"endTime" : "2017-02-17T01:14:00.000+0000",
"minutes" : 210,
"trafficEmployeeId" : {
"id" : 3422
}
},
{
"version" : 1,
"jobTaskId" : {
"id" : 16089453
},
"endTime" : "2017-02-16T01:14:00.000+0000",
"minutes" : 400,
"trafficEmployeeId" : {
"id" : 3422
}
}
]
}
以下是我的收藏:员工
{
"_id" : ObjectId("58a66cc0c76ed0f7e9f52d0e"),
"data" : [
{
"version" : 67,
"userName" : "Jimjeff2",
"employeeDetails" : {
"id" : 3422,
"version" : 135
},
"personalDetails" : {
"id" : 24487,
"version" : 32,
"firstName" : "Jim",
"lastName" : "Jeffrey"
}
},
{
"version" : 37,
"userName" : "sandyub2",
"employeeDetails" : {
"id" : 3562,
"version" : 15
},
"personalDetails" : {
"id" : 24487,
"version" : 32,
"firstName" : "Sandy",
"lastName" : "Mason"
}
}
]
}
所以,我正在尝试使用 employeeDetloy.id
将使用 trafficEmployeeId.id 的集合中的多个分配数组匹配到相应的员工集合>我正在使用此功能:
db.allocations.find().forEach(
function (findAllocations) {
findAllocations.employees = db.employees.findOne( { "trafficEmployeeId.id": findAllocations.trafficEmployeeId.id } );
findAllocations.allocations = db.allocations.find( { "employeeDetails.id": findAllocations.employeeDetails.id } ).toArray();
db.allocationsReloaded.insert(findAllocations);
}
);
db.allocationsReloaded.find().pretty()
我收到了结果:
TypeError: findAllocations.trafficEmployeeId is undefined :
@(shell):3:61
DBQuery.prototype.forEach@src/mongo/shell/query.js:477:1
@(shell):1:1
答案 0 :(得分:0)
您好我发现您使用承诺时遇到问题。每个db调用都是异步的,因此您需要确保在使用结果之前得到结果。一种方法是在回调中使用所需的功能。例如:
db.find({_id:"id"},function(data, error) { //your code that depends the variables here})
但是,对于您的情况,我建议使用$lookup
函数:
这是一个代码示例:
db.allocations.aggregate([
{$match: {"yourSearchParameters"}},
{$lookup : {from:"employees",localField:"trafficEmployeeId",foreignField:"employeeDetails.id",as:"employees"}}])
希望我的回答很有帮助