MongoDB:更新一个字段上的每个文档

我有一个收集名为foo假设。

foo的每个实例都有一个名为lastlookdat的字段,它是自epoch以来的UNIX时间戳。我希望能够遍历MongoDB客户端,并将所有现有文档(大约有20,000个)的时间戳设置为当前时间戳。

最好的处理方法是什么?

235238 次浏览

不管版本是什么,对于你的例子,<update>是:

{  $set: { lastLookedAt: Date.now() / 1000 }  }

但是,根据您的MongoDB版本的不同,查询看起来会有所不同。无论版本如何,关键是空条件{}将匹配任何文档. c。在MongoDB shell中,或者在任何MongoDB客户端中:

$version >= 3.2:

db.foo.updateMany( {}, <update> )
  • {}是条件(空条件匹配任何文档)

3.2 > $version >= 2.2:

db.foo.update( {}, <update>, { multi: true } )
  • {}是条件(空条件匹配任何文档)
  • {multi: true}是“更新多个文档”选项

$version <2.2 < / >:

db.foo.update( {}, <update>, false, true )

我已经使用MongoDB . net驱动程序一个多月了。如果我要使用. net驱动程序,我将在集合对象上使用Update方法。首先,我将构造一个查询,它将获得我感兴趣的所有文档,并对我想要更改的字段进行更新。Mongo中的更新只影响第一个文档,要更新查询产生的所有文档,需要使用“Multi”更新标志。示例代码如下…

var collection = db.GetCollection("Foo");
var query = Query.GTE("No", 1); // need to construct in such a way that it will give all 20K //docs.
var update = Update.Set("timestamp", datetime.UtcNow);
collection.Update(query, update, UpdateFlags.Multi);

这段代码将对您有帮助

        Model.update({
'type': "newuser"
}, {
$set: {
email: "abc@gmail.com",
phoneNumber:"0123456789"
}
}, {
multi: true
},
function(err, result) {
console.log(result);
console.log(err);
})

可以使用mongodb的updateMany()方法来更新多个文档

简单的查询是这样的

db.collection.updateMany(filter, update, options)

欲了解更多updatemany文档,请阅读在这里

根据你的要求,更新代码将像这样:

User.updateMany({"created": false}, {"$set":{"created": true}});

这里你需要使用元组,因为你只想把created从true改为false。如果你想改变整个doc,那么你不需要使用元组