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

ran*_*its 197 mongodb

foo假设收集了一个名字.

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

处理这个问题的最佳方法是什么?

Phi*_*ier 427

在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 用于"多"参数(更新多个记录)


小智 8

此代码对您有所帮助

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


Har*_*tel 7

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

简单的查询是这样的

db.collection.updateMany(filter, update, options)
Run Code Online (Sandbox Code Playgroud)

有关更新的更多文档,请阅读此处

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

User.updateMany({"created": false}, {"$set":{"created": true}});
Run Code Online (Sandbox Code Playgroud)

这里你需要使用$set,因为你只想将create从true更改为false。供参考。如果你想更改整个文档那么你不需要使用$set


use*_*459 5

我使用 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);
Run Code Online (Sandbox Code Playgroud)