基本加入MongoDB

时间:2017-02-17 16:03:21

标签: mongodb

我正在尝试对两个集合进行连接/合并,根据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

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"}}])

希望我的回答很有帮助