Memasukkan dokumen JSON dengan kunci `.` ke MongoDB

14

Pertama, ini lebih merupakan pertanyaan desain daripada pertanyaan pemrograman.

Saya membuat aplikasi di mana saya harus mengambil data JSON yang ada dan memasukkannya ke dalam MongoDB. Saya menemukan bahwa beberapa dokumen JSON memiliki periode .di kunci mereka. Saya membaca dalam dokumentasi MongoDB bahwa periode .tidak diizinkan sebagai kunci dalam MongoDB karena digunakan untuk query.

Saya tidak melakukan banyak penyisipan dalam aplikasi web, itu cukup banyak penyisipan satu kali. Juga, sebagian besar saya akan mengambil seluruh dokumen daripada meminta bagian-bagiannya karena saya perlu mendapatkan semua data.

Jadi, mempertimbangkan persyaratan saya, saya punya dua pilihan tentang cara menyimpan dokumen JSON:

  1. Cari melalui JSON untuk periode di kunci dan melarikan diri dan kemudian memasukkannya ke dalam MongoDB.
  2. Konversi seluruh JSON ke dalam format BSON dan simpan seperti itu, sehingga menghindari kebutuhan untuk melarikan diri, dan secara manual mengurai JSON saat dibutuhkan di luar MongoDB

Bisakah Anda memberi tahu saya desain mana yang lebih baik, karena saya tidak dapat menyimpulkan.

anirudh
sumber
Salah satu cara untuk mengatasinya adalah dengan menggunakan metode menyisipkan dan mengatur parameter check_keys ke false. Cara lain adalah dengan menelusuri dokumen Anda dan mengganti setiap kemunculan titik terkutuk dengan sesuatu yang lain atau karakter unicode yang setara (well, karakter).
Noah

Jawaban:

3

Ada beberapa alternatif:

1. Ganti titik-titik dengan tanda hubung.

Ini akan menjadi pendekatan favorit saya, karena membuat struktur cukup eksplisit.

Karena menurut Anda, "itu cukup banyak penyisipan satu kali," itu harus relatif sederhana untuk memeriksa apakah tidak merusak apa pun (yaitu sudah ada kunci yang sama dengan tanda hubung). Untuk situasi lain, melakukan pemeriksaan itu secara terprogram mengharuskan untuk menulis beberapa kode, tetapi masih merupakan tugas yang relatif mudah.

2. Ganti titik dengan karakter dot Unicode seperti U + FF0E .

Saya akan sangat menyarankan terhadap pendekatan ini, karena akan menyebabkan sakit kepala debugging besar - besaran di jalan . Membiarkan seseorang yang menggunakan JSON yang dihasilkan di suatu tempat dalam kode jauh dari MongoDB untuk menebak bahwa sebuah titik tidak benar-benar sebuah titik adalah cara yang baik untuk benar-benar menghabiskan waktu berminggu-minggu dari waktu seseorang. Simpan trik Unicode seperti itu untuk para peretas yang ingin menipu seseorang agar berpikir bahwa karakter itu berbeda.

3. Gunakan BSON.

Karena Anda mengklaim bahwa Anda "sebagian besar akan mengambil seluruh dokumen daripada meminta bagian-bagiannya," pendekatan ini tidak memiliki kelemahan utama dalam kasus Anda . Meskipun, Anda mengatakan "sebagian besar," yang berarti bahwa kadang-kadang, Anda hanya akan mengambil bagian dari dokumen.

Secara umum, kelemahannya adalah Anda tidak akan dapat mencari melalui dokumen atau hanya memuat sebagian saja.

4. Gunakan pengkodean standar, seperti Base64.

Mengubah kunci yang bermasalah (atau semua kunci, tergantung pada rasio antara yang bermasalah dan yang tidak bermasalah) ke Base64 atau heksadesimal bisa menjadi solusi yang layak, dengan manfaat menjadi agak eksplisit: sebagian besar pengembang akan mengenali nilai Base64 atau heksadesimal sekilas .

Kekurangannya adalah peningkatan jejak memori, serta keharusan untuk menyandikan dan mendekode kunci saat menggunakannya.

5. Setel check_keyske false.

Saya akan sangat menyarankan terhadap pendekatan ini, karena ini akan membuat permintaan data ambigu, dan membuang-buang waktu atau hari mencoba untuk mencari tahu mengapa permintaan tertentu tidak melakukan apa yang Anda bayangkan seharusnya dilakukan. Dot adalah karakter yang dilindungi undang-undang dan tanda centang ada di sini untuk melindungi Anda; dengan memberi tahu MongoDB untuk melewatkan cek, Anda hanya akan menunda saat di mana Anda harus berurusan dengan konflik antara sintaksis MongoDB dan karakter cadangan yang digunakan dalam kunci.

Arseni Mourzenko
sumber
0

Cukup gunakan BSON. Kemudian Anda memiliki format yang terdokumentasi dengan baik, dengan dukungan pustaka yang teruji dengan baik, dan yang paling penting Anda dapat membalikkannya (encode / decode) tanpa kehilangan.

J_H
sumber