mongoDB - 游标仅使用node.js驱动程序更新1个文档

时间:2017-01-28 14:48:00

标签: javascript node.js mongodb

我将mongoDB(3.4)与node.js驱动程序一起使用,并且我试图更新" items_collection"中包含的所有文档中的字段。我尝试了几种不同的方法,但我似乎无法找到正确更新所有文档的解决方案。以下是我目前获得的代码:

var cursor = db.collection('items_collection').find();
cursor.on("end", function() {
    console.log("Finished. Closing db...");
    db.close();
}); 

cursor.on("err", function() {
    console.dir("Error on:" + err);
    throw err;
});

cursor.on("data", function(doc) {
    cursor.pause();

    var newTitle = getTitleFromDescription(doc.description);
    db.collection('items_collection').update({_id: doc._id}, {$set:{title: newTitle}}, {multi:true});

    cursor.resume();
});

这对我来说似乎是合理的,但它只是第一个将其标题更新为" test_title"的文档。我一定错过了一些明显的东西吗?

感谢。

2 个答案:

答案 0 :(得分:2)

使用更新代替保存,并将multi : true用于多个文档udpates:

db.collectionname.update( {}, { $set:{ title : "newvalue" } }, { multi : true } );

默认情况下,MongoDB中的所有更新都是单数。您必须添加multi : true

cursor.on("data", function(doc) {
    cursor.pause();

    var newTitle = getTitleFromDescription(doc.description);

    console.log(doc._id);
    console.log(newTitle);

    db.collection('items_collection').update({_id: doc._id}, {$set:{title: newTitle}}, {multi:true}).then(function(response){
        console.log(response);  
        console.log('++++++++++++++++++');
        cursor.resume();
    });
});

答案 1 :(得分:0)

您可以通过多次更新轻松完成此操作。假设您要更新集合中的每个文档,您可以这样做:

db.collection("items_collection").update({},{$set:{title: "test_title"},{multi:true} );

文档清楚地解释了here

另请注意,您必须更新多个更新的运算符表达式。如果您要更新单个文档,update方法的第二个参数可以是field:value的普通对象,但多重更新必须使用update operator,如$set在上面的例子中。