{
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
}
}
mongodb
mongodb-query
database
TIMEX
sumber
sumber
tags.words
seharusnya$unset
, bukanwords
? Lihat juga jawaban Salvador Dali.updateMany
sebagai gantinya{multi:true}
, yaitudb.example.updateMany({},{"$unset":{words:""}})
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
$unset
operator , 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.
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).
sumber
Kami juga dapat menggunakan ini untuk memperbarui banyak dokumen.
sumber
false, true
dua argumen terakhir untukupdate()
Untuk menghapus atau menghapus bidang di MongoDB
Untuk Rekaman tunggal
Untuk Multi Rekam
sumber
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:
Untuk menghapus kolom
words
dari dokumen yang disematkan, lakukan ini:atau menggunakan
updateMany
Hanya
$unset
akan mengeditnya jika nilainya ada tetapi tidak akan melakukan navigasi yang aman (itu tidak akan memeriksa jikatags
ada terlebih dahulu) sehingga ada diperlukan pada dokumen tertanam.Ini menggunakan semua operator posisi (
$[]
) yang diperkenalkan di versi 3.6sumber
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:
Contoh:
Dalam contoh Anda:
sumber
Mulai
Mongo 4.2
, mungkin juga menggunakan sintaks yang sedikit berbeda:The pembaruan metode juga dapat menerima pipa agregasi (perhatikan kurung kuadrat menandakan penggunaan pipa agregasi).
Ini berarti
$unset
operator yang digunakan adalah agregasi (sebagai lawan dari kueri "" ), yang sintaksnya mengambil array bidang.sumber
Solusi untuk PyMongo (Python mongo):
sumber
Dan untuk mongomapper,
Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )
sumber
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:
sumber
{name: 'book', tag: {kata-kata: ['abc', '123'], lat: 33, panjang: 22}}
Jawab:
db.tablename.remove ({'tags.words': ['abc', '123']})
sumber
Memeriksa apakah "kata" ada dan kemudian menghapus dari dokumen
true menunjukkan pembaruan beberapa dokumen jika cocok.
sumber
Anda juga dapat melakukan ini secara agregat dengan menggunakan proyek di 3.4
{$ project: {"tags.words": 0}}
sumber
Untuk referensi paket dan menghapus berbagai "kunci", coba ini
sumber