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

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});
Shaunak
sumber
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).

Salvador Dali
sumber
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.

Vipul
sumber
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})
Viral Patel
sumber
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

Jonathon Gardner
sumber
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})
Amitesh
sumber
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.

Xavier Guihot
sumber
1

Solusi untuk PyMongo (Python mongo):

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

Dan untuk mongomapper,

  • Dokumen: Shutoff
  • Bidang yang akan dihapus: shutoff_type

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

Jon Kern
sumber
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)
LaundroMat
sumber
-2

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

Jawab:

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

Poonam Agrawal
sumber
-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.

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

joel Raja
sumber
-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"
}
)]
aspadacio
sumber