Làm cách nào để xóa hoàn toàn một trường khỏi tài liệu MongoDB?


307
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Giả sử đây là một tài liệu. Làm cách nào để xóa " words" hoàn toàn khỏi tất cả các tài liệu trong bộ sưu tập này? Tôi muốn tất cả các tài liệu không có " words":

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

Câu trả lời:


532

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});

1
Xem giải pháp cho câu hỏi này để được giải thích về stackoverflow
true.com/questions/7714216/iêu

1
Không còn nhận xét nào bởi "Nic Cottrell" ở bất cứ đâu trên trang này :)
Dan Dascalescu 19/12/18

6
Có phải tôi đang thiếu một cái gì đó, hoặc điều này đã sai trong hơn 8 năm, bởi vì tags.wordsnên $unset, không phải words? Xem thêm câu trả lời của Salvador Dali.
Dan Dascalescu

1
Bạn cũng có thể sử dụng updateManythay vì {multi:true}, tức làdb.example.updateMany({},{"$unset":{words:""}})
Kip

158

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 $unsettoá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).


2
Ngoài ra, nếu các thẻ là một mảng thì nó sẽ như thế này: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah

21
db.example.updateMany({},{"$unset":{"tags.words":1}})

Chúng tôi cũng có thể sử dụng điều này để cập nhật nhiều tài liệu.


2
tôi thấy điều này rõ ràng hơn là vượt qua false, truenhư hai cuộc tranh cãi cuối cùngupdate()
Kip

17

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

2

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 wordskhỏ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 $unsetchỉ 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 tagstồ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


1

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

1

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à $unsettoá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.


1

Giải pháp cho PyMongo (Python mongo):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);

0

Và đối với mongomapper,

  • Tài liệu: Tắt
  • Trường cần xóa: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )


0

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)

-2

{name: 'book', tags: {words: ['abc', '123'], lat: 33, long: 22}}

Trả lời:

db.tablename.remove ({'tags.words': ['abc', '123']})


-3

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 không cần phải kiểm tra sự tồn tại. Các tiểu bang tài liệu rằng: "Nếu trường không tồn tại, sau đó $ unset không làm gì (tức là không hoạt động)."
Dan Dascalescu

-4

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


-7

Để tham khảo một gói và loại bỏ các "khóa" khác nhau, hãy thử điều này

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
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.