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

时间:2012-01-27 18:55:25

标签: mongodb

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

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

处理此问题的最佳方式是什么?

4 个答案:

答案 0 :(得分:392)

在Mongo shell中,或与任何Mongodb客户端一起使用:

•对于Mongodb> = 3.2:

db.foo.updateMany({}, {$set: {lastLookedAt: Date.now() / 1000}})

请参阅http://docs.mongodb.org/manual/tutorial/modify-documents/#update-multiple-documents

  • {}是条件(空条件匹配任何文档)
  • {$set: {lastLookedAt: Date.now() / 1000}}是您想要做的事情

•对于Mongodb> = 2.2:

db.foo.update({}, {$set: {lastLookedAt: Date.now() / 1000}}, { multi: true })

请参阅http://docs.mongodb.org/manual/tutorial/modify-documents/#update-multiple-documents

  • {}是条件(空条件匹配任何文档)
  • {$set: {lastLookedAt: Date.now() / 1000}}是您想要做的事情
  • {multi: true}是“更新多个文档”选项

•对于Mongodb< 2.2:

db.foo.update({}, {$set: {lastLookedAt: Date.now() / 1000}}, false, true)

请参阅https://web.archive.org/web/20120613233453/http://www.mongodb.org/display/DOCS/Updating

  • {}是条件(空条件匹配任何文档)
  • {$set: {lastLookedAt: Date.now() / 1000}}是您想要做的事情
  • false用于“upsert”参数(如果不存在则插入,否则更新 - 不是您想要的)
  • true用于“multi”参数(更新多个记录)

答案 1 :(得分:7)

此代码对您有所帮助

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

答案 2 :(得分:3)

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

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);

答案 3 :(得分:0)

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

简单查询就是这样

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

有关uppdate的更多文档,请阅读here

根据您的要求,更新代码将如下所示:

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

在这里您需要使用$set,因为您只想将创建的内容从true更改为false。对于参考。如果要更改整个文档,则无需使用 $ set