Câu trả lời:
Hãy thử điều này: Nếu bộ sưu tập của bạn là 'ví dụ'
db.example.update({}, {$unset: {words:1}}, false, true);
Tham khảo điều này:
http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset
CẬP NHẬT :
Liên kết trên không còn bao gồm '$ unset'ing. Hãy chắc chắn để thêm {multi: true}
nếu bạn muốn xóa trường này khỏi tất cả các tài liệu trong bộ sưu tập; nếu không, nó sẽ chỉ xóa nó khỏi tài liệu đầu tiên mà nó tìm thấy phù hợp. Xem phần này để biết tài liệu cập nhật:
https://docs.mongodb.com/manual/reference/operator/update/unset/
Thí dụ:
db.example.update({}, {$unset: {words:1}} , {multi: true});
tags.words
nên $unset
, không phải words
? Xem thêm câu trả lời của Salvador Dali.
updateMany
thay vì {multi:true}
, tức làdb.example.updateMany({},{"$unset":{words:""}})
Ban đầu, tôi không hiểu tại sao câu hỏi có tiền thưởng (tôi nghĩ rằng câu hỏi đó có câu trả lời hay và không có gì để thêm), nhưng sau đó tôi nhận thấy rằng câu trả lời được chấp nhận và nâng cấp 15 lần là thực sự sai!
Có, bạn phải sử dụng $unset
toán tử , nhưng việc bỏ đặt này sẽ loại bỏ khóa từ không tồn tại đối với tài liệu cho bộ sưu tập. Vì vậy, về cơ bản nó sẽ không làm gì.
Vì vậy, bạn cần nói với Mongo tìm trong các thẻ tài liệu và sau đó trong các từ bằng cách sử dụng ký hiệu dấu chấm . Vì vậy, truy vấn chính xác là.
db.example.update(
{},
{ $unset: {'tags.words':1}},
false, true
)
Để hoàn thành, tôi sẽ đề cập đến một cách làm khác , điều này tệ hơn nhiều, nhưng theo cách này bạn có thể thay đổi trường bằng bất kỳ mã tùy chỉnh nào (thậm chí dựa trên trường khác từ tài liệu này).
Để xóa hoặc xóa trường trong MongoDB
Đối với bản ghi đơn
db.getCollection('userData').update({}, {$unset: {pi: 1}})
Đối với nhiều bản ghi
db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
Tôi đã cố gắng làm một cái gì đó tương tự như thế này nhưng thay vào đó loại bỏ cột khỏi một tài liệu nhúng. Phải mất một thời gian tôi mới tìm được giải pháp và đây là bài đăng đầu tiên tôi tìm thấy nên tôi nghĩ tôi sẽ đăng bài này ở đây cho bất kỳ ai khác cố gắng làm điều tương tự.
Vì vậy, hãy nói thay vì dữ liệu của bạn trông như thế này:
{
name: 'book',
tags: [
{
words: ['abc','123'],
lat: 33,
long: 22
}, {
words: ['def','456'],
lat: 44,
long: 33
}
]
}
Để xóa cột words
khỏi tài liệu nhúng, hãy làm điều này:
db.example.update(
{'tags': {'$exists': true}},
{ $unset: {'tags.$[].words': 1}},
{multi: true}
)
hoặc sử dụng updateMany
db.example.updateMany(
{'tags': {'$exists': true}},
{ $unset: {'tags.$[].words': 1}}
)
Các $unset
chỉ chỉnh sửa nó nếu giá trị tồn tại nhưng nó sẽ không làm một chuyển hướng an toàn (nó sẽ không kiểm tra nếu tags
tồn tại đầu tiên) để tồn tại là cần thiết trên các tài liệu nhúng.
Điều này sử dụng tất cả toán tử vị trí ( $[]
) đã được giới thiệu trong phiên bản 3.6
Theo mặc định, phương thức update () cập nhật một tài liệu. Đặt Đa tham số để cập nhật tất cả các tài liệu phù hợp với tiêu chí truy vấn.
Thay đổi trong phiên bản 3.6. Cú pháp:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
Thí dụ :
db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})
Trong ví dụ của bạn:
db.getCollection('products').update({},{$unset: {'tags.words' :1}}, {multi: true})
Bắt đầu Mongo 4.2
, cũng có thể sử dụng một cú pháp hơi khác:
// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }
Các bản cập nhật phương pháp cũng có thể chấp nhận một đường ống kết hợp (chú ý dấu ngoặc vuông biểu thị việc sử dụng một đường ống kết hợp).
Điều này có nghĩa là $unset
toán tử đang được sử dụng là tập hợp (trái ngược với "truy vấn" ), có cú pháp lấy một mảng các trường.
Giải pháp cho PyMongo (Python mongo):
db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Vì tôi liên tục tìm thấy trang này khi tìm cách xóa trường bằng MongoEngine, tôi đoán có thể hữu ích khi đăng cách MongoEngine ở đây:
Example.objects.all().update(unset__tags__words=1)
{name: 'book', tags: {words: ['abc', '123'], lat: 33, long: 22}}
Trả lời:
db.tablename.remove ({'tags.words': ['abc', '123']})
Kiểm tra nếu "từ" tồn tại và sau đó xóa khỏi tài liệu
db.users.update({"tags.words" :{$exists: true}},
{$unset:{"tags.words":1}},false,true);
true chỉ ra cập nhật nhiều tài liệu nếu khớp.
bạn cũng có thể thực hiện việc này trong tổng hợp bằng cách sử dụng dự án tại 3,4
{$ dự án: {"tags.words": 0}}