假设我有一个名为foo的集合。
foo的每个实例都有一个名为lastlookdat的字段,该字段是自epoch以来的UNIX时间戳。我希望能够遍历MongoDB客户端,并将所有现有文档(大约有20,000个)的时间戳设置为当前时间戳。
最好的处理方法是什么?
假设我有一个名为foo的集合。
foo的每个实例都有一个名为lastlookdat的字段,该字段是自epoch以来的UNIX时间戳。我希望能够遍历MongoDB客户端,并将所有现有文档(大约有20,000个)的时间戳设置为当前时间戳。
最好的处理方法是什么?
当前回答
我已经使用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);
其他回答
不管版本是什么,对于你的例子,<update>是:
{ $set: { lastLookedAt: Date.now() / 1000 } }
但是,根据您的MongoDB版本的不同,查询看起来会有所不同。无论版本如何,关键是空条件{}将匹配任何文档。在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 )
{}是条件(空条件匹配任何文档) False是“upsert”参数 True为“multi”参数(更新多条记录)
我已经使用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);
可以使用mongodb的updateMany()方法来更新多个文档
简单的查询是这样的
db.collection.updateMany(filter, update, options)
更多文档更新请阅读这里
根据您的要求,更新代码将是这样的:
User.updateMany({"created": false}, {"$set":{"created": true}});
这里你需要使用$set,因为你只是想把created从true改为false。如果你想改变整个文档,那么你不需要使用$set
这段代码将对您有帮助
Model.update({
'type': "newuser"
}, {
$set: {
email: "abc@gmail.com",
phoneNumber:"0123456789"
}
}, {
multi: true
},
function(err, result) {
console.log(result);
console.log(err);
})