MongoDB: perbarui setiap dokumen pada satu bidang

214

Saya memiliki koleksi bernama foohipotetis.

Setiap instance dari foomemiliki bidang yang disebut lastLookedAt yang merupakan cap waktu UNIX sejak zaman. Saya ingin dapat melewati klien MongoDB dan mengatur stempel waktu itu untuk semua dokumen yang ada (sekitar 20.000 di antaranya) ke stempel waktu saat ini.

Apa cara terbaik untuk menangani ini?

Randand
sumber
Kemungkinan duplikat MongoDB: Bagaimana cara memperbarui banyak dokumen dengan satu perintah?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

458

Terlepas dari versi, untuk contoh Anda, <update>ini adalah:

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

Namun, tergantung pada versi MongoDB Anda, kueri akan terlihat berbeda. Terlepas dari versi, kuncinya adalah bahwa kondisi kosong {}akan cocok dengan dokumen apa pun . Di shell Mongo, atau dengan klien MongoDB apa pun:

$ versi> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} adalah kondisinya (kondisi kosong cocok dengan dokumen apa pun)

3.2> $ versi> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} adalah kondisinya (kondisi kosong cocok dengan dokumen apa pun)
  • {multi: true} adalah opsi "perbarui banyak dokumen"

$ versi <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} adalah kondisinya (kondisi kosong cocok dengan dokumen apa pun)
  • falseuntuk parameter " upsert "
  • true untuk parameter "multi" (perbarui beberapa catatan)
Philippe Plantier
sumber
Date.now () juga mengembalikan stempel waktu. Lihat developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier
Ini masih memberi saya tanggal yang tidak tepat di dekat semua contoh foo ini. Setelah menjalankan itu saya melakukan db.foo.findOne () dan lastLookedAt adalah: 1327691719186, yang diterjemahkan menjadi jruby-1.6.5: 011> Time.at (1327691719186) => Sun 16 Nov 02:19:46 -0500 44042
randombits
1
Sayangnya, waktu POSIX menggunakan detik, sedangkan waktu Javascript menggunakan milidetik. Date.now () / 1000 seharusnya bekerja. Anda mungkin harus mengatasinya.
Philippe Plantier
psh {kosong} itulah yang melakukannya untuk saya, terima kasih Phil
Jona
1
Bagaimana melakukannya untuk nilai lama + "beberapa string"
Mahesh K
11

Kode ini akan sangat membantu Anda

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "[email protected]",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  
Jitendra
sumber
4

Saya telah menggunakan driver MongoDB .NET selama sebulan lebih sedikit. Jika saya melakukannya menggunakan driver .NET, saya akan menggunakan metode Pembaruan pada objek koleksi. Pertama, saya akan membuat kueri yang akan memberi saya semua dokumen yang saya minati dan melakukan Pembaruan pada bidang yang ingin saya ubah. Pembaruan dalam bahasa Mongo hanya memengaruhi dokumen pertama dan untuk memperbarui semua dokumen yang dihasilkan dari kueri, seseorang harus menggunakan bendera pembaruan 'Multi'. Kode contoh mengikuti ...

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);
pengguna1163459
sumber