MongoDB中的基本连接

MongoDB中的基本连接,mongodb,Mongodb,我正在尝试连接/合并两个集合,如下所示: 用户:Orlando Becerra 我知道MongoDB是非关系型的,因为V3.2有一些但有限的能力来做到这一点 你能告诉我是否有可能做我下面尝试的事情(例如,我在正确的道路上),或者如果不可能的话。。还是另一种方法最好 这是我的收藏:分配 { "_id" : ObjectId("58a65c082c5fc49016c6a3cd"), "data" : [ { "version" : 0, "jobTaskId

我正在尝试连接/合并两个集合,如下所示:

用户: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"
            }
    }
]
}
这是我的收藏:员工

{
"_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"
            }
    }
]
}
因此,我尝试使用trafficEmployeeId.id将集合中的多个分配数组与使用employeeDetails.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

您好,我看到您在使用承诺时遇到问题。每个db调用都是异步的,因此您需要确保在使用结果之前有一个结果。一种方法是在回调中使用所需的函数。例如:

db.find({_id:"id"},function(data, error) { //your code that depends the variables here})
但是,对于您的情况,我建议您使用
$lookup
功能:

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()
下面是一个代码示例:

db.allocations.aggregate([ 
{$match: {"yourSearchParameters"}}, 
{$lookup : {from:"employees",localField:"trafficEmployeeId",foreignField:"employeeDetails.id",as:"employees"}}])
希望我的回答有帮助