Tambahkan bidang baru ke setiap dokumen dalam koleksi MongoDB

335

Bagaimana saya bisa menambahkan bidang baru ke setiap dokumen dalam koleksi yang ada?

Saya tahu cara memperbarui bidang dokumen yang ada tetapi tidak cara menambahkan bidang baru ke setiap dokumen dalam koleksi. Bagaimana saya bisa melakukan ini di mongoshell?

ini aku
sumber

Jawaban:

600

Sama seperti memperbarui bidang koleksi yang ada, $setakan menambahkan bidang baru jika bidang yang ditentukan tidak ada.

Lihat contoh ini:

> db.foo.find()
> db.foo.insert({"test":"a"})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> item = db.foo.findOne()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> db.foo.update({"_id" :ObjectId("4e93037bbf6f1dd3a0a9541a") },{$set : {"new_field":1}})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "new_field" : 1, "test" : "a" }

EDIT:

Jika Anda ingin menambahkan new_field ke semua koleksi Anda, Anda harus menggunakan pemilih kosong, dan mengatur multi flag ke true (param terakhir) untuk memperbarui semua dokumen

db.your_collection.update(
  {},
  { $set: {"new_field": 1} },
  false,
  true
)

EDIT:

Dalam contoh di atas 2 bidang terakhir false, truemenentukan upsertdan multibendera.

Upsert: Jika disetel ke true, buat dokumen baru saat tidak ada dokumen yang cocok dengan kriteria kueri.

Multi: Jika disetel ke true, perbarui beberapa dokumen yang memenuhi kriteria kueri. Jika disetel ke false, perbarui satu dokumen.

Ini untuk orang Mongo versionssebelum 2.2. Untuk versi terbaru kueri diubah sedikit

db.your_collection.update({},
                          {$set : {"new_field":1}},
                          {upsert:false,
                          multi:true}) 
RameshVel
sumber
7
Apakah mungkin membuat tanpa nilai
Yasar Arafath
7
db.your_collection.update ({}, {$ set: {"new_field": null}}, {upsert: false, multi: true})
Nilesh
1
bagaimana jika saya ingin membuat array kosong?
Prashant Pokhriyal
3
@PrashantPokhriyal db.your_collection.update ({}, {$ set: {"new_field": []}}, {upsert: false, multi: true})
Máxima Alekz
3
Bagaimana jika Anda ingin membuat bidang baru dengan nilai yang ditetapkan secara dinamis? Sebagai contoh, saya ingin memiliki new_fieldint yang sama dengan panjang string di testlapangan.
qed
3

Untuk memperjelas, sintaksnya adalah sebagai berikut untuk MongoDB versi 4.0.x:

db.collection.update({},{$set: {"new_field*":1}},false,true)

Berikut ini adalah contoh kerja menambahkan bidang yang diterbitkan ke koleksi artikel dan menetapkan nilai bidang menjadi true :

db.articles.update({},{$set: {"published":true}},false,true)
LineDrop
sumber
0

Pymongo 3.9+

update()sekarang tidak berlaku dan Anda harus menggunakan replace_one(), update_one()atau update_many()sebaliknya.

Dalam kasus saya, saya menggunakan update_many()dan itu memecahkan masalah saya:

db.your_collection.update_many({}, {"$set": {"new_field": "value"}}, upsert=False, array_filters=None)

Dari dokumen

update_many(filter, update, upsert=False, array_filters=None, bypass_document_validation=False, collation=None, session=None)


filter: A query that matches the documents to update.

update: The modifications to apply.

upsert (optional): If True, perform an insert if no documents match the filter.

bypass_document_validation (optional): If True, allows the write to opt-out of document level validation. Default is False.

collation (optional): An instance of Collation. This option is only supported on MongoDB 3.4 and above.

array_filters (optional): A list of filters specifying which array elements an update should apply. Requires MongoDB 3.6+.

session (optional): a ClientSession.
Alex Jolig
sumber