MongoDB koleksiyonundaki her belgeye yeni alan ekleyin


334

Mevcut bir koleksiyondaki her belgeye nasıl yeni bir alan ekleyebilirim?

Mevcut bir belgenin alanını nasıl güncelleyeceğimi biliyorum, ancak bir koleksiyondaki her belgeye nasıl yeni bir alan ekleyeceğimi bilmiyorum. Bunu mongokabukta nasıl yapabilirim ?

Yanıtlar:


600

Mevcut toplama alanının güncellenmesiyle aynı $set, belirtilen alan yoksa yeni alanlar ekler.

Bu örneği inceleyin:

> 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" }

DÜZENLE:

Tüm koleksiyonunuza new_field eklemek istiyorsanız, boş seçici kullanmanız ve tüm belgeleri güncellemek için çoklu bayrağı true (son parametre) olarak ayarlamanız gerekir.

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

DÜZENLE:

Yukarıdaki örnekte son 2 alan ve işaretlerini false, truebelirtir . upsertmulti

Yukarı: Doğru olarak ayarlanırsa, sorgu ölçütleriyle eşleşen belge olmadığında yeni bir belge oluşturur.

Çoklu: Doğru olarak ayarlanırsa, sorgu ölçütlerini karşılayan birden çok belgeyi güncelleştirir. False olarak ayarlanırsa, bir belgeyi günceller.

Bu daha versionsönce Mongo içindir 2.2. En son sürümlerde sorgu biraz değiştirildi

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


7
db.your_collection.update ({}, {$ ayarlayın: { "new_field'a": null}}, {Upsert: false, çok: true})
Nilesh

1
boş bir dizi oluşturmak istersem ne olur?
Prashant Pokhriyal

3
@PrashantPokhriyal db.your_collection.update ({}, {$ set: {"new_field": []}}, {upsert: false, multi: true})
Máxima Alekz

3
Dinamik olarak atanan değere sahip yeni bir alan oluşturmak isterseniz ne olur? Örneğin, alandaki new_fielddize uzunluğuna eşit bir int olmak istiyorum test.
qed

3

Açıklığa kavuşturmak için, sözdizimi MongoDB sürüm 4.0.x için aşağıdaki gibidir:

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

Makaleler koleksiyonuna yayınlanmış bir alan ekleyen ve alanın değerini true olarak ayarlayan çalışan bir örnek :

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

0

Pymongo 3.9+

update()artık önerilmemektedir ve kullanmak gerekir replace_one(), update_one()ya da update_many()onun yerine.

Benim durumumda kullandım update_many()ve sorunumu çözdü:

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

Belgelerden

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.