Bagaimana cara menghapus bidang sepenuhnya dari dokumen MongoDB?


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

Misalkan ini dokumen. Bagaimana saya menghapus " words" sepenuhnya dari semua dokumen dalam koleksi ini? Saya ingin semua dokumen tanpa " words":

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

Jawaban:


532

Coba ini: Jika koleksi Anda adalah 'contoh'

db.example.update({}, {$unset: {words:1}}, false, true);

Lihat ini:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

PEMBARUAN :

Tautan di atas tidak lagi mencakup '$ tidak disetel'. Pastikan untuk menambahkan {multi: true}jika Anda ingin menghapus bidang ini dari semua dokumen dalam koleksi; jika tidak, itu hanya akan menghapusnya dari dokumen pertama yang cocok. Lihat ini untuk dokumentasi yang diperbarui:

https://docs.mongodb.com/manual/reference/operator/update/unset/

Contoh:

db.example.update({}, {$unset: {words:1}} , {multi: true});

1
Lihat solusi untuk pertanyaan ini untuk penjelasan tentang false / true stackoverflow.com/questions/7714216/…
Dsel

1
Tidak ada komentar dari "Nic Cottrell" di mana saja di halaman ini :)
Dan Dascalescu

6
Apakah saya kehilangan sesuatu, atau apakah ini salah selama 8+ tahun, karena tags.wordsseharusnya $unset, bukan words? Lihat juga jawaban Salvador Dali.
Dan Dascalescu

1
Anda juga dapat menggunakan updateManysebagai gantinya {multi:true}, yaitudb.example.updateMany({},{"$unset":{words:""}})
Kip

158

Pada awalnya, saya tidak mengerti mengapa pertanyaan itu memiliki karunia (saya pikir pertanyaan itu memiliki jawaban yang bagus dan tidak ada yang perlu ditambahkan), tetapi kemudian saya perhatikan bahwa jawaban yang diterima dan di-upgrade sebanyak 15 kali sebenarnya salah!

Ya, Anda harus menggunakan $unsetoperator , tetapi ini tidak disetel akan menghapus kata kunci yang tidak ada untuk dokumen untuk koleksi. Jadi pada dasarnya itu tidak akan melakukan apa-apa.

Jadi, Anda perlu memberi tahu Mongo untuk melihat tag dokumen dan kemudian menggunakan notasi titik . Jadi permintaan yang benar adalah.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Demi penyelesaian, saya akan merujuk ke cara lain untuk melakukannya , yang jauh lebih buruk, tetapi dengan cara ini Anda dapat mengubah bidang dengan kode khusus apa pun (bahkan berdasarkan bidang lain dari dokumen ini).


2
Selain itu, jika tag adalah array maka akan menjadi seperti ini: db.example.update ({}, {$ unset: {'tag. $ []. Words': 1}}, false, true)
Manan Shah

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

Kami juga dapat menggunakan ini untuk memperbarui banyak dokumen.


2
Saya menemukan ini lebih jelas daripada melewati false, truedua argumen terakhir untukupdate()
Kip

17

Untuk menghapus atau menghapus bidang di MongoDB

  • Untuk Rekaman tunggal

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • Untuk Multi Rekam

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

2

Saya mencoba melakukan sesuatu yang mirip dengan ini tetapi bukannya menghapus kolom dari dokumen yang disematkan. Butuh beberapa saat untuk menemukan solusi dan ini adalah posting pertama yang saya temui jadi saya pikir saya akan memposting ini di sini untuk orang lain yang mencoba melakukan hal yang sama.

Jadi katakanlah sebaliknya, data Anda terlihat seperti ini:

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

Untuk menghapus kolom wordsdari dokumen yang disematkan, lakukan ini:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

atau menggunakan updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

Hanya $unsetakan mengeditnya jika nilainya ada tetapi tidak akan melakukan navigasi yang aman (itu tidak akan memeriksa jika tagsada terlebih dahulu) sehingga ada diperlukan pada dokumen tertanam.

Ini menggunakan semua operator posisi ( $[]) yang diperkenalkan di versi 3.6


1

Secara default, metode pembaruan () memperbarui satu dokumen. Setel Multi Parameter untuk memperbarui semua dokumen yang sesuai dengan kriteria kueri.

Diubah dalam versi 3.6. Sintaks:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Contoh:

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

Dalam contoh Anda:

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})

1

Mulai Mongo 4.2, mungkin juga menggunakan sintaks yang sedikit berbeda:

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

The pembaruan metode juga dapat menerima pipa agregasi (perhatikan kurung kuadrat menandakan penggunaan pipa agregasi).

Ini berarti $unsetoperator yang digunakan adalah agregasi (sebagai lawan dari kueri "" ), yang sintaksnya mengambil array bidang.


1

Solusi untuk PyMongo (Python mongo):

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

0

Dan untuk mongomapper,

  • Dokumen: Shutoff
  • Bidang yang akan dihapus: shutoff_type

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


0

Karena saya terus menemukan halaman ini ketika mencari cara untuk menghapus bidang menggunakan MongoEngine, saya kira mungkin bermanfaat untuk memposting cara MongoEngine di sini juga:

Example.objects.all().update(unset__tags__words=1)

-2

{name: 'book', tag: {kata-kata: ['abc', '123'], lat: 33, panjang: 22}}

Jawab:

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


-3

Memeriksa apakah "kata" ada dan kemudian menghapus dari dokumen

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true menunjukkan pembaruan beberapa dokumen jika cocok.


Anda tidak perlu memeriksa keberadaannya. The dokumentasi menyatakan bahwa: "Jika lapangan tidak ada, maka $ unset tidak apa-apa (yaitu tidak ada operasi)."
Dan Dascalescu

-4

Anda juga dapat melakukan ini secara agregat dengan menggunakan proyek di 3.4

{$ project: {"tags.words": 0}}


-7

Untuk referensi paket dan menghapus berbagai "kunci", coba ini

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.