nodejs,mongodb使用forEach查找并更新

时间:2018-08-06 05:47:08

标签: node.js mongodb asynchronous promise find

我在使用forEach和更新时遇到问题,

我想用B集合的文档更新A集合。 例如,

db.collection(B).find().toArray(function(err, result) {
    ....
    result.forEach(doc){
        ....
        db.collection(A).updateOne(query...){
        }
    }
}

而且,B不仅是一个大学。在我的代码中,B是数组,并且B = [B1,B2,B3 ...]。 (不是我的真实值名称是B。仅是示例)

我想使用Promise或async,但是我不知道如何使用。

for(i = 0; i < B.length; i++)
    also as same upper code

有什么想法或方法可以解决此问题吗? T.T ..

我的B的文档字段是这样的。

{_id:ObjectId(..), value1:[a, b], value2:"ccc"}

然后,我从a中提取x,从b中提取y,从value2中提取z; 以及我想要的A的文档字段是这样的,

{_id:ObjectId(..), x : x, y : y, z : z, ids:[id1]}

从B开始,在获取每一列的同时,它与x,y,z匹配,只是添加ids数组,如

{_id:ObjectId(..), x : x, y : y, z : z, ids:[id1, id2]}

它与x,y,z不匹配,只需插入

{_id:ObjectId(..), x : x, y : y, z : z, ids:[id1]}.]

我使用了updateOne(查询,值,upsert)

query : {x:x, y:y, z:z}
value : {$set:{x:x, y:y, z:z}, $addToSet:{ids:{$each:{id}}}}
upsert : {upsert:true}

1 个答案:

答案 0 :(得分:0)

示例:使用A来更新集合B

 db.getCollection('B').find().forEach(function (doc1) {
    var updateData = {x :doc1.value1[0], y:doc1.value1[1], z: doc1.value2 };
    var doc2 = db.getCollection('A').findOne(updateData);
    if (doc2 != null) {
         db.getCollection('A').update(updateData,{ $addToSet: { 'ids': doc1._id }})
    }else{
         updateData.ids = [doc1._id];
         db.getCollection('A').save(updateData);
    }

});

参考链接:How to update a collection based on another collection in MongoDB?