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

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

最好的处理方法是什么?


当前回答

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

简单的查询是这样的

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

更多文档更新请阅读这里

根据您的要求,更新代码将是这样的:

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

这里你需要使用$set,因为你只是想把created从true改为false。如果你想改变整个文档,那么你不需要使用$set

其他回答

可以使用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);
        })  

我已经使用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”参数(更新多条记录)