Inserimento del documento JSON con '.' in chiave per MongoDB

9

In primo luogo, si tratta più di una domanda di progettazione che di una domanda di programmazione.

Sto creando un'applicazione in cui devo recuperare i dati JSON esistenti e inserirli in MongoDB. Ho scoperto che alcuni dei documenti JSON hanno un punto . nella loro chiave. Ho letto nella documentazione di MongoDB che i periodi . non sono consentiti come chiavi in MongoDB in quanto vengono utilizzati per le query.

Non faccio molti inserimenti nelle applicazioni web, è praticamente un inserimento una tantum. Inoltre, vorrei principalmente recuperare l'intero documento piuttosto che interrogare per parti di esso in quanto ho bisogno di ottenere tutti i dati.

Quindi, considerando i miei requisiti, ho due scelte su come memorizzare il documento JSON:

  1. Cerca nel codice JSON per un periodo nelle chiavi e sfuggi loro e quindi inseriscile in MongoDB.
  2. Converti l'intero JSON in formato BSON e memorizzali come tali, evitando così la necessità di eseguire l'escape e analizzali manualmente il JSON quando necessario al di fuori di MongoDB

Potresti dirmi quale sarebbe un design migliore, dato che non sono in grado di giungere a una conclusione.

    
posta anirudh 16.06.2015 - 12:07
fonte

2 risposte

1

Ci sono alcune alternative:

1. Sostituisci punti con un trattino.

Questo sarebbe il mio approccio preferito, in quanto mantiene la struttura abbastanza esplicita.

Poiché secondo te "è praticamente un inserimento una tantum", dovrebbe essere relativamente semplice controllare se non si rompe nulla (cioè c'è già una stessa chiave con un trattino). Per altre situazioni, eseguire tali controlli a livello di programmazione richiede di scrivere del codice, ma è ancora un compito relativamente facile.

2. Sostituisci punti con un carattere punto Unicode come U + FF0E .

Vorrei strongmente sconsigliare questo approccio, poiché porterebbe a massivo mal di testa per il debug lungo la strada . Lasciare qualcuno che usa il JSON risultante da qualche parte nel codice lontano da MongoDB per indovinare che un punto non è proprio un punto è un buon modo per sprecare letteralmente settimane del tempo di qualcuno. Tieni questi trucchi Unicode agli hacker che vogliono indurre qualcuno a pensare che un personaggio sia diverso.

3. Usa BSON.

Dal momento che affermi che "per lo più recuperi l'intero documento piuttosto che eseguire query per parti di esso", questo approccio non presenta grossi inconvenienti nel tuo caso . Anche se hai detto "principalmente", il che significa che a volte, recupererai solo parti del documento.

In generale, lo svantaggio è che non potrai cercare nel documento o caricarne solo una parte.

4. Utilizza una codifica standard, come Base64.

La conversione delle chiavi problematiche (o di tutte le chiavi, a seconda del rapporto tra problematiche e non problematiche) su Base64 o esadecimale potrebbe essere una soluzione praticabile, con il vantaggio di essere piuttosto esplicita: la maggior parte degli sviluppatori riconoscerebbe i valori Base64 o esadecimali a colpo d'occhio.

Lo svantaggio è l'aumento dell'impronta di memoria, oltre alla necessità di codificare e decodificare le chiavi quando li si usa.

5. Imposta check_keys su false .

Vorrei strongmente sconsigliare questo approccio, dato che renderebbe la query dei dati ambigua e sprecare ore o giorni cercando di capire perché una query specifica non fa ciò che si immagina dovrebbe essere facendo. Dot è un personaggio riservato e il controllo è qui per proteggerti; dicendo a MongoDB di saltare l'assegno, rimanderai solo il momento in cui dovrai affrontare un conflitto tra la sintassi di MongoDB e il carattere riservato usato in una chiave.

    
risposta data 24.01.2018 - 21:56
fonte
0

Usa solo BSON. Quindi hai un formato ben documentato, con un supporto di librerie ben testato e, soprattutto, puoi invertirlo (codificare / decodificare) senza perdite.

    
risposta data 25.11.2017 - 20:16
fonte

Leggi altre domande sui tag