在MongoDB中合并来自两个集合的文档时出现问题

时间:2017-02-23 00:12:53

标签: mongodb

我正在一个集合中的mongoDB中创建country-> locations文档。

然后我创建一个单独的临时集合作为ETL工作的一部分(部门 - >员工)。

然后,我想在location_id上的匹配项中插入与数组中的位置相关的部门。

这是位置文档(country-> locations):

enter image description here

以下是临时馆藏中的部门文件(部门 - >员工):

enter image description here

我想遍历每个位置记录,然后找到匹配的部门并将它们添加到该位置内的“部门”数组中,但我正在努力:

到目前为止,JavaScript是:

function stuffDepartmentsIntoLocations() {
    var ops = [];

        var departments = function() {
        this.deptsArray = [];
    };

    db.HR.find().forEach(function(country) 
        {
            for(var i=0;i < country.locations.length; i++) {

                              departments.deptsArray= [];

                db.tempDEPTS.find({"LOCATION_ID":country.locations[i].LOCATION_ID}).forEach(function(dept) 
                {
                    departments.deptsArray.push(dept);
                                });

                db.tempDEPTS.find({"LOCATION_ID":country.locations[i].LOCATION_ID}).forEach(function(dept) 
                    {
                        ops.push(
                            {
                                    "updateOne": 
                                {
                                        "filter": {"_id": country._id },
                                        "update": {"$push": {"locations": {$each: [] ,$position: i }}}
                                        }
                                } 
                            );
                        if ( ops.length == 1000 ) {
                                db.HR.bulkWrite(ops,{ "ordered": false });
                                ops = [];
                        }
                    }               
                );          
             }      
      }
    );

   if ( ops.length > 0 ) {
     db.HR.bulkWrite(ops,{ "ordered": false });
   }

 return true;
}

但这不起作用,我看不到任何插入。

我想得到的是相关位置内的新“部门”数组(由LOCATION_ID匹配),然后将1个或多个部门文档插入到数组中。即这样的事情(简化以获得指出)。

但是您可以看到创建的部门数组中插入了临时集合中的所有部门文档(即使只有一个部门,“部门”也需要是一个数组)。

enter image description here

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

我实际上使用$ lookup和$ out非常接近,但并不完全。

如果我创建了2个临时集合,那么通过查找和输出将它们连接到最终集合中:

{
    db.tempLOCATIONS.aggregate([
    {
            $unwind: "$locations"
    },
        {
            $lookup:
                {
                    from: "tempDEPTS",
                    localField: "locations.LOCATION_ID",
                    foreignField: "LOCATION_ID",
                    as: "locations.departments"
                }
     },
         { 
        $group : { _id : {COUNTRY_ID:"$COUNTRY_ID", COUNTRY_NAME:"$COUNTRY_NAME"}, locations: { $push: "$locations" }}

     },
         {
        $out:  "HR"
         }

])
}

我在下面得到这个。唯一的问题是我不希望我的“_id”字段是“COUNTRY_ID”和“COUNTRY_NAME”的复合,我只想要一个正常的“_id”,并且“COUNTRY_ID”和“COUNTRY_NAME”位于根目录:

enter image description here