Perché MongoDB verifica l'ordine delle chiavi quando corrispondono i documenti incorporati?

7

La documentazione db.collection.find() include questa spiegazione di Query corrispondenze esatte su documenti incorporati :

The following operation returns documents in the bios collection where the embedded document name is exactly { first: "Yukihiro", last: "Matsumoto" }, including the order

Mi sembra così strano, dal momento che i documenti sembrano tipi di dati non ordinati (mi ricordano JSON, dizionari Python, ecc.).

Quando questo problema ha aumentato la sua brutta testa nel mio codice, mi ci è voluto un po 'per capire cosa c'era che non andava, dal momento che è così poco intuitivo che l'ordine delle chiavi di un oggetto JavaScript potrebbe entrare in gioco.

Perché questo è il comportamento in MongoDB?

    
posta tscizzle 25.05.2016 - 18:48
fonte

1 risposta

6

Why is this the behavior in MongoDB?

I documenti MongoDB sono archiviati sul server in un formato binario chiamato BSON (abbreviazione di "Binary JSON"), che è simile a JSON formato che supporta tipi di dati aggiuntivi. Il formato JSON è stato progettato per essere leggibile da umani e derivato da tipi di dati e comportamenti supportati da JavaScript. BSON è stato progettato come formato di scambio di dati binari con un controllo più preciso sulla rappresentazione dei dati.

Mentre BSON è simile a JSON, ci sono differenze notevoli:

  • Una struttura dati BSON è un oggetto ordinato, non un dizionario. Ad esempio, BSON non richiede che i nomi dei campi siano univoci (sebbene i driver di solito siano predefiniti in un'interfaccia hash / dizionario / JSON-like che non supporta i nomi di campi duplicati). Ciò fornisce agli sviluppatori precisione che può essere importante per alcuni casi d'uso ed evita anche un sovraccarico del server potenzialmente superfluo di ispezione e serializzazione / deserializzazione ricorsiva di BSON in un ordine di campo predefinito.
  • Laddove l'ordine è importante, i driver ufficialmente supportati si basano sul linguaggio di programmazione sottostante per supportare una struttura di dati che preserva l'ordine o fornire il proprio. Ad esempio, il driver Python (noto anche come PyMongo) include una classe SON per manipolare oggetti ordinati simile a un normale dizionario Python.
  • BSON supporta tipi di dati aggiuntivi come dati binari, numeri interi a 32 e 64 bit, float e decimali (MongoDB 3.4+). Come semplice contrasto per la rappresentazione numerica, JSON (e JavaScript) attualmente supportano solo un tipo numerico singolo ( Number ) che rappresenta tutti i valori come un numero in virgola mobile a doppia precisione.
  • MongoDB ha definito regole di confronto e ordinamento per i valori BSON. Ad esempio, MongoDB utilizza il confronto binario semplice per le stringhe per impostazione predefinita, e MongoDB 3.4+ aggiunge l'opzione regole di confronto specifiche per la lingua .

 it's so unintuitive that the order of a Javascript object's keys would come into play

L'esempio di query che hai fornito è per un corrispondenza esatta su un documento incorporato , che include l'ordine dei campi perché i dati sottostanti sono ordinati in BSON. Questa query esegue un confronto binario della serializzazione BSON del documento incorporato fornito nella query rispetto al valore del campo BSON con il documento incorporato memorizzato in MongoDB. È possibile sfruttare l'ordine dei campi per inserire in modo coerente un campo più selettivo in precedenza nel documento incorporato, che può essere d'aiuto con le prestazioni della query se si è indicizzato l'intero documento incorporato.

Se l'ordine dei campi non è importante, è necessario eseguire una query su corrispondente ai campi incorporati , ad es.

db.bios.find(
    {
       "name.first": "Yukihiro",
       "name.last": "Matsumoto"
    }
)

In questo caso dovresti creare un indice composto per supporta le tue domande comuni. La selettività, l'ordine e la direzione di ordinamento delle chiavi nella definizione dell'indice sarebbero significative se si desidera che gli indici efficienti supportino le query.

    
risposta data 16.01.2017 - 13:05
fonte

Leggi altre domande sui tag