MongoDB:1つのフィールドのすべてのドキュメントを更新する


214

foo仮に名前の付いたコレクションを持っています。

の各インスタンスにfooは、エポック以降のUNIXタイムスタンプであるlastLookedAtというフィールドがあります。MongoDBクライアントを通過して、既存のすべてのドキュメント(そのうちの約20,000)のタイムスタンプを現在のタイムスタンプに設定できるようにしたいと思います。

これを処理する最良の方法は何ですか?


回答:


458

バージョンに関係なく、あなたの例では、これ<update>は:

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

ただし、MongoDBのバージョンによっては、クエリの外観が異なります。バージョンに関係なく、重要なのは、空の条件{}がどのドキュメントにも一致することです。Mongoシェル、または任意の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 )
  • {} 条件です(空の条件は任意のドキュメントに一致します)
  • falseupsert」パラメータ用です
  • true 「マルチ」パラメーター用(複数のレコードを更新)

Date.now()もタイムスタンプを返します。developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…を
Philippe Plantier 2012年

それでも、これらのfooのすべてのインスタンスに適切な日付ではありません。私はdb.foo.findOne()とlastLookedAtを行うことを実行した後である:1327691719186、JRubyの-1.6.5に換算さ:011> Time.at(1327691719186)=>日11月16日2時19分46秒-0500 44042
randombits

1
私の悪い、POSIX時間は秒を使用しますが、JavaScript時間はミリ秒を使用します。ただし、Date.now()/ 1000は機能するはずです。あなたはそれを丸める必要があるかもしれません。
Philippe Plantier、2012年

pshそれは私のためにそれをやったその空の{}です、フィルに感謝します
ジョナ

1
oldvalue + "some string"に対してそれを行う方法
Mahesh K

11

このコードはあなたのために役立ちます

        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ドライバーを1か月以上使用しています。.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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.