Câu trả lời:
Giống như trường cập nhật bộ sưu tập hiện có, $set
sẽ thêm một trường mới nếu trường được chỉ định không tồn tại.
Kiểm tra ví dụ này:
> 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" }
BIÊN TẬP:
Trong trường hợp bạn muốn thêm new_field vào tất cả bộ sưu tập của mình, bạn phải sử dụng bộ chọn trống và đặt nhiều cờ thành true (tham số cuối cùng) để cập nhật tất cả các tài liệu
db.your_collection.update(
{},
{ $set: {"new_field": 1} },
false,
true
)
BIÊN TẬP:
Trong ví dụ trên, 2 trường cuối false, true
chỉ định các cờ upsert
và multi
.
Upsert: Nếu được đặt thành true, sẽ tạo một tài liệu mới khi không có tài liệu nào khớp với tiêu chí truy vấn.
Đa: Nếu được đặt thành đúng, cập nhật nhiều tài liệu đáp ứng tiêu chí truy vấn. Nếu được đặt thành false, cập nhật một tài liệu.
Đây là cho Mongo versions
trước 2.2
. Đối với các phiên bản mới nhất, truy vấn được thay đổi một chút
db.your_collection.update({},
{$set : {"new_field":1}},
{upsert:false,
multi:true})
new_field
một số nguyên bằng với độ dài của chuỗi trong test
trường.
Để làm rõ, cú pháp như sau đối với MongoDB phiên bản 4.0.x:
db.collection.update({},{$set: {"new_field*":1}},false,true)
Dưới đây là một ví dụ hoạt động khi thêm trường được xuất bản vào bộ sưu tập bài viết và đặt giá trị của trường thành đúng :
db.articles.update({},{$set: {"published":true}},false,true)
Pymongo 3.9+
update()
hiện đang bị phản đối và bạn nên sử dụng replace_one()
, update_one()
hoặc update_many()
thay thế.
Trong trường hợp của tôi, tôi đã sử dụng update_many()
và nó đã giải quyết vấn đề của tôi:
db.your_collection.update_many({}, {"$set": {"new_field": "value"}}, upsert=False, array_filters=None)
Từ tài liệu
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.