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.