Saya ingin mendapatkan nama semua kunci dalam koleksi MongoDB.
Sebagai contoh, dari ini:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Saya ingin mendapatkan kunci unik:
type, egg, hello
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
db.runCommand({..., out: { "inline" : 1 }}).results.map(function(i) { return i._id; });
Dengan jawaban Kristina sebagai inspirasi, saya menciptakan alat sumber terbuka yang disebut Variety yang melakukan ini: https://github.com/variety/variety
sumber
Anda dapat menggunakan agregasi dengan yang baru
$objectToArrray
di3.4.4
versi mengkonversi semua tombol atas & pasangan nilai ke array dokumen diikuti oleh$unwind
&$group
dengan$addToSet
mendapatkan kunci yang berbeda di seluruh koleksi.$$ROOT
untuk referensi dokumen tingkat atas.Anda dapat menggunakan kueri di bawah ini untuk mendapatkan kunci dalam satu dokumen.
sumber
.next()["allkeys"]
perintah (dengan asumsi koleksi memiliki setidaknya satu elemen).Coba ini:
sumber
Jika koleksi target Anda tidak terlalu besar, Anda dapat mencoba ini di bawah mongo shell client:
sumber
Solusi bersih dan dapat digunakan kembali menggunakan pymongo:
Pemakaian:
sumber
if (typeof(this[key]) == 'number')
sebelumnyaemit(key, null)
.Menggunakan python. Mengembalikan set semua kunci tingkat atas dalam koleksi:
sumber
Berikut ini contoh yang digunakan dalam Python: Sampel ini mengembalikan hasil inline.
sumber
Jika Anda menggunakan mongodb 3.4.4 dan yang lebih tinggi maka Anda dapat menggunakan agregasi
$objectToArray
dan$group
agregasi di bawah iniIni contoh kerjanya
sumber
$match
di awal pipa agregasi untuk hanya mendapatkan kunci dokumen yang cocok dengan suatu kondisi.Saya heran, tidak ada seorang pun di sini yang menggunakan ans dengan logika sederhana
javascript
danSet
secara otomatis memfilter nilai duplikat, contoh sederhana pada mongo shell seperti di bawah ini:Ini akan mencetak semua kunci unik yang mungkin ada dalam nama koleksi : collectionName .
sumber
Ini berfungsi baik untuk saya:
sumber
Saya pikir cara terbaik untuk melakukan ini seperti yang disebutkan di sini adalah di mongod 3.4.4+ tetapi tanpa menggunakan
$unwind
operator dan hanya menggunakan dua tahap dalam pipa. Sebaliknya kita bisa menggunakan$mergeObjects
dan$objectToArray
operator.Pada
$group
tahap ini, kami menggunakan$mergeObjects
operator untuk mengembalikan satu dokumen di mana kunci / nilai berasal dari semua dokumen dalam koleksi.Lalu tibalah
$project
tempat kami menggunakan$map
dan$objectToArray
mengembalikan kunci.Sekarang jika kita memiliki dokumen bersarang dan ingin mendapatkan kunci juga, ini bisa dilakukan. Untuk kesederhanaan, mari pertimbangkan dokumen dengan dokumen tersemat sederhana yang terlihat seperti ini:
Pipa berikut menghasilkan semua kunci (field1, field2, field3, field4).
Dengan sedikit usaha, kita bisa mendapatkan kunci untuk semua sub dokumen dalam bidang array di mana elemen-elemennya juga objek.
sumber
$unwind
akan meledak koleksi (no.of bidang * no.of dokumen), kita dapat menghindarinya dengan menggunakan$mergeObjects
semua versi>3.6
.. Lakukan hal yang sama, Seharusnya melihat jawaban ini sebelumnya, hidup saya akan lebih mudah seperti itu ( -_-)Mungkin sedikit di luar topik, tetapi Anda dapat mencetak semua kunci / bidang suatu objek secara rekursif:
Berguna ketika semua objek dalam koleksi memiliki struktur yang sama.
sumber
Untuk mendapatkan daftar semua kunci minus
_id
, pertimbangkan menjalankan pipa agregat berikut:sumber
Saya mencoba menulis dalam nodejs dan akhirnya muncul dengan ini:
Setelah membaca koleksi yang baru dibuat "allFieldNames", hapus.
sumber
Sesuai dokumentasi mongoldb , kombinasi dari
distinct
dan operasi pengumpulan indeks adalah apa yang akan mengembalikan semua nilai yang mungkin untuk kunci yang diberikan, atau indeks:
Jadi dalam metode yang diberikan seseorang dapat menggunakan metode seperti yang berikut, untuk menanyakan koleksi untuk semua indeks terdaftarnya, dan kembali, ucapkan objek dengan indeks untuk kunci (contoh ini menggunakan async / menunggu NodeJS, tetapi jelas Anda dapat menggunakan pendekatan asinkron lainnya):
Jadi, meminta koleksi dengan
_id
indeks dasar , akan mengembalikan yang berikut (koleksi tes hanya memiliki satu dokumen pada saat tes):Pikiran Anda, ini menggunakan metode asli ke Driver NodeJS. Seperti yang disarankan beberapa jawaban lain, ada beberapa pendekatan lain, seperti kerangka kerja agregat. Saya pribadi menemukan pendekatan ini lebih fleksibel, karena Anda dapat dengan mudah membuat dan menyempurnakan cara mengembalikan hasil. Jelas, ini hanya membahas atribut tingkat atas, bukan yang bersarang. Juga, untuk menjamin bahwa semua dokumen terwakili jika ada indeks sekunder (selain yang _id utama), indeks tersebut harus ditetapkan sebagai
required
.sumber
Kita dapat mencapai ini dengan Menggunakan file mongo js. Tambahkan kode di bawah ini di file getCollectionName.js Anda dan jalankan file js di konsol Linux seperti yang diberikan di bawah ini:
Terima kasih @ackuser
sumber
Mengikuti utas dari jawaban @James Cropcho, saya mendarat di yang berikut yang menurut saya super mudah digunakan. Ini adalah alat biner, yang persis seperti apa yang saya cari: mongoeye .
Dengan menggunakan alat ini, dibutuhkan sekitar 2 menit untuk mengekspor skema saya dari baris perintah.
sumber
Saya tahu pertanyaan ini berumur 10 tahun tetapi tidak ada solusi C # dan ini membutuhkan waktu berjam-jam untuk mencari tahu. Saya menggunakan driver .NET dan
System.Linq
mengembalikan daftar kunci.sumber
Saya sedikit memperluas solusi Carlos LM sehingga lebih detail.
Contoh skema:
Ketik ke konsol:
Lari:
Keluaran
sumber
Saya punya 1 pekerjaan sederhana di ...
Apa yang dapat Anda lakukan adalah ketika memasukkan data / dokumen ke "koleksi" utama Anda, Anda harus memasukkan atribut dalam 1 koleksi terpisah, katakanlah "things_attributes".
jadi setiap kali Anda memasukkan "hal-hal", Anda mendapatkan dari "hal-hal_attributes" membandingkan nilai-nilai dokumen itu dengan kunci dokumen baru Anda jika ada hadiah kunci baru menambahkannya dalam dokumen itu dan memasukkan kembali lagi.
Jadi things_attributes hanya akan memiliki 1 dokumen kunci unik yang dapat Anda dapatkan dengan mudah kapan pun Anda perlukan dengan menggunakan findOne ()
sumber