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

MongoDB:更新一个字段上的每个文档,mongodb,Mongodb,假设我有一个名为foo的集合 foo的每个实例都有一个名为lastLookedAt的字段,该字段是自epoch以来的UNIX时间戳。我希望能够通过MongoDB客户端,将所有现有文档(大约20000个)的时间戳设置为当前时间戳 处理此问题的最佳方法是什么?无论版本如何,例如,都是: {$set:{lastLookedAt:Date.now()/1000} 但是,根据您的MongoDB版本,查询看起来会有所不同。无论版本如何,关键是空条件{}将匹配任何文档。在Mongo shell中,或使用任何

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

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


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

无论版本如何,例如,
都是:

{$set:{lastLookedAt:Date.now()/1000}
但是,根据您的MongoDB版本,查询看起来会有所不同。无论版本如何,关键是空条件
{}
将匹配任何文档。在Mongo shell中,或使用任何MongoDB客户端:

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

db.foo.update({},{multi:true})
  • {}
    是条件(空条件匹配任何文档)
  • {multi:true}
    是“更新多个文档”选项
“参数
  • true
    用于“multi”参数(更新多条记录)

  • 我已经使用MongoDB.NET驱动程序一个多月了。如果我使用.NET驱动程序,我会对集合对象使用更新方法。首先,我将构造一个查询,获取我感兴趣的所有文档,并对我要更改的字段进行更新。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)
    
    有关更多文档,请参阅

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

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

    您需要在此处使用,因为您只想将created从true更改为false。参考。如果您想更改整个文档,则不需要使用$set

    Date.now()也返回一个时间戳。看到了吗,它仍然为我提供了一个日期,对于所有这些foo实例来说,它都不在最右边。运行之后,我执行了一个db.foo.findOne(),lastLookedAt为:13276919186,它转换为jruby-1.6.5:011>Time.at(1327691719186)=>Sun Nov 16 02:19:46-0500 44042我的错,POSIX时间使用秒,而Javascript时间使用毫秒。日期。现在()/1000应该可以工作了。你可能需要舍入它。psh是那个空的{}为我做的,感谢PhilHow为oldvalue+“某些字符串”可能重复的