Thêm trường mới vào mọi tài liệu trong bộ sưu tập MongoDB


334

Làm cách nào tôi có thể thêm một trường mới vào mỗi tài liệu trong bộ sưu tập hiện có?

Tôi biết cách cập nhật trường tài liệu hiện có nhưng không biết cách thêm trường mới vào mỗi tài liệu trong bộ sưu tập. Làm thế nào tôi có thể làm điều này trong mongovỏ?

Câu trả lời:


598

Giống như trường cập nhật bộ sưu tập hiện có, $setsẽ 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, truechỉ định các cờ upsertmulti.

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 versionstrướ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}) 

7
Có thể tạo mà không có giá trị
Yasar Arafath

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

1
Nếu tôi muốn tạo một mảng trống thì sao?
Pokhriyal Prashant

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

3
Điều gì nếu bạn muốn tạo trường mới với giá trị được gán động? Ví dụ, tôi muốn có new_fieldmột số nguyên bằng với độ dài của chuỗi trong testtrường.
qed

2

Để 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)

0

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.