【问题标题】:MongoDB: update every document on one fieldMongoDB:更新一个字段上的每个文档
【发布时间】:2012-02-20 18:03:18
【问题描述】:

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

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

最好的处理方法是什么?

【问题讨论】:

标签: mongodb


【解决方案1】:

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

简单查询是这样的

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

更多更新文档请阅读here

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

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

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

【讨论】:

    【解决方案2】:

    无论版本如何,对于您的示例,<update> 是:

    {  $set: { lastLookedAt: Date.now() / 1000 }  }
    

    但是,根据您的 MongoDB 版本,查询看起来会有所不同。无论版本如何,关键是空条件{} 将匹配任何文档。在 Mongo 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”参数(更新多条记录)

    【讨论】:

    • Date.now() 也返回一个时间戳。见developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
    • 它仍然给我一个日期,对于所有这些 foo.运行后我做了一个 db.foo.findOne() 和 lastLookedAt 是:1327691719186,它转换为 jruby-1.6.5 :011 > Time.at(1327691719186) => Sun Nov 16 02:19:46 -0500 44042
    • 我的错,POSIX 时间使用秒,而 Javascript 时间使用毫秒。不过 Date.now() / 1000 应该可以工作。您可能需要对其进行舍入。
    • psh 是那个空的 {} 为我做的,谢谢 Phil
    • oldvalue+"some string"怎么办
    【解决方案3】:

    此代码将对您有所帮助

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

    【讨论】:

      【解决方案4】:

      我已经使用 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多