MongoDB'nin anahtarında `.` ile JSON belgesi ekleme


14

İlk olarak, bu bir programlama sorusundan ziyade bir tasarım sorusudur.

Mevcut JSON verilerini alıp MongoDB'ye eklemek zorunda olduğum bir uygulama oluşturuyorum. Bazı JSON belgelerinin .anahtarlarında bir süre bulunduğunu gördüm . MongoDB belgelerinde, .sorgulama için kullanıldıkları için MongoDB'de anahtar olarak noktalara izin verilmediğini okudum .

Web uygulamalarında çok fazla ekleme yapmam, hemen hemen bir kerelik bir ekleme. Ayrıca, ben tüm veri almak için ihtiyaç olarak ben çoğunlukla tüm bölümlerini sorgulama yerine belgenin tamamını almak istiyorum.

Bu nedenle, gereksinimlerimi göz önünde bulundurarak, JSON belgesinin nasıl saklanacağı konusunda iki seçeneğim var:

  1. Anahtarlarda dönem için JSON'da arama yapın ve kaçın ve ardından MongoDB'ye yerleştirin.
  2. Tüm JSON'u BSON formatına dönüştürün ve bu şekilde saklayın, böylece kaçma ihtiyacını önleyin ve gerektiğinde MongoDB dışında JSON'u ayrıştırın

Bir sonuca varamadığım için hangisinin daha iyi bir tasarım olacağını söyleyebilir misiniz?


Bunu çözmenin bir yolu, insert yöntemini kullanmak ve check_keys parametresini false olarak ayarlamaktır. Başka bir yol, belgenizi gözden geçirmek ve lanet olası noktanın her tekrarını başka bir şey veya eşdeğer bir unicode karakteri (iyi, karakterler) ile değiştirmektir.
Noah

Yanıtlar:


3

Birkaç alternatif var:

1. Noktaları bir tire işareti ile değiştirin.

Yapıyı yeterince açık tuttuğu için bu benim en sevdiğim yaklaşım olacaktır.

Sana göre, “hemen hemen bir kerelik bir yerleştirme” olduğundan, hiçbir şeyi kırıp kırmadığını kontrol etmek nispeten basit olmalı (yani, bir tire ile zaten aynı anahtar var). Diğer durumlarda, bu kontrolleri programlı olarak yapmak bazı kodların yazılmasını gerektirir, ancak yine de nispeten kolay bir iştir.

2. Noktaları U + FF0E gibi bir Unicode nokta karakteriyle değiştirin .

Yolda büyük hata ayıklama baş ağrılarına yol açacağı için bu yaklaşıma şiddetle karşı çıkacağım . Ortaya çıkan JSON'u kodda bir yerde MongoDB'den uzak bir yerde kullanan bir noktanın gerçekten bir nokta olmadığını tahmin etmesine izin vermek, birinin zamanının tam anlamıyla haftalarını harcamak için iyi bir yoldur. Birini bir karakterin farklı olduğunu düşünmek için kandırmak isteyen bilgisayar korsanlarına böyle Unicode hileleri tutun.

3. BSON kullanın.

“Belgenin bazı bölümlerini sorgulamak yerine tüm belgeyi alacağınızı” iddia ettiğiniz için, bu yaklaşımın sizin durumunda büyük dezavantajları yoktur . “Çoğunlukla” demenize rağmen, bazen belgenin yalnızca bir kısmını alırsınız.

Genel olarak, dezavantaj, belgede arama yapamayacağınız veya belgenin yalnızca bir kısmını yükleyemeyeceğinizdir.

4. Base64 gibi standart bir kodlama kullanın.

Sorunlu anahtarları (veya sorunlu ve sorunlu olmayanlar arasındaki orana bağlı olarak tüm anahtarları) Base64 veya onaltılık biçime dönüştürmek, oldukça açık olma avantajıyla geçerli bir çözüm olabilir: çoğu geliştirici Base64 veya onaltılık değerleri bir bakışta tanıyacaktır. .

Dezavantajı, artan bellek kaplamanın yanı sıra, tuşları kullanırken kodlama ve kod çözme gerekliliğidir.

5. Set check_keysiçin false.

Ben bu yaklaşıma şiddetle tavsiye ediyorum, çünkü veri sorgusunu belirsizleştirecek ve belirli bir sorgunun yapması gerektiğini düşündüğünüz şeyi neden yapmadığını anlamaya çalışırken saatler veya günler harcayacağım. Nokta ayrılmış bir karakter ve kontrol sizi korumak için burada; MongoDB'ye kontrolü atlamasını söyleyerek, sadece MongoDB sözdizimi ile bir anahtarda kullanılan ayrılmış karakter arasındaki bir çatışmayla başa çıkmak zorunda kalacağınız zamanı ertelersiniz.


0

Sadece BSON kullanın. Daha sonra, iyi test edilmiş kütüphane desteği ile iyi belgelenmiş bir biçime sahipsiniz ve en önemlisi, kayıpsız olarak tersine çevirebilirsiniz (kodlama / kod çözme).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.