我在使用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}
答案 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?