Domanda

con un indice composto come il seguente

db.data.ensureIndex({ userId: 1, myObject: 1 })
.

Verrà a trovare il seguente indice?

db.data.find({ 
  userId: 1,
  myObject: {
    a:'test',
    b:'test2'
  }
})
.

Lo so in JavaScript che gli oggetti non preservano il loro ordine, così è lo stesso in Mongo?

Allora, cosa succederà se ho documenti con oggetti in diversi ordini come questo.

{
  _id: ObjectId,
  userId:1,
  myObject: {
    b: 'test',
    a: 'test2'
  }
},

{
  _id: ObjectId,
  userId:1,
  myObject: {
    b: 'test',
    a: 'test2'
  }
},

{
  _id: ObjectId,
  userId:2,
  myObject: {
    b: 'test',
    a: 'test2'
  }
}
.

L'ordine delle proprietà conta quando si indicizza un oggetto come sopra?

Modifica: Nella documentazione, http://docs.mongodb.org/manual/core/index-Single / Dice "Quando si esegue l'esecuzione di corrispondenze di uguaglianza su subdocumenti, questioni di campo di campo e i sottodocumenti devono corrispondere esattamente."

E nel loro esempio, il seguente funzionerebbe

db.factories.find( { metro: { city: "New York", state: "NY" } } )
.

Ma se i campi della metropolitana fossero l'altro intorno a ciò non funzionerà

db.factories.find( { metro: { state: "NY", city: "New York" } } )
.

Allora, come si preserisce l'ordine della proprietà in JavaScript / Nodo quando la lingua stessa non lo supporta?

È stato utile?

Soluzione

In realtà, Javascript o JSON Notation Objects conserve il loro ordine. Mentre alcune proprietà di alto livello potrebbero mescolare se MongoDB deve spostarle come cresce un documento, in generale questo documento "sotto-livello" non dovrebbe modificare dall'ordine in cui è stato originariamente inserito.

Detto che alcune lingue cercano di ordinare il loro "hash", "mappa", i tasti "Dict" per impostazione predefinita, e quindi diventa importante trovare e "ordinato" o modulo "indicizzato" quando si tratta di questi, ma questo è un altro problema.

Alla tua domanda di un "indice" per MongoDB che colpisce questo ordine, no no. Infatti l'indice aggiunto, sebbene non sia errori come tale, non ha alcun valore come un Object o {} essenzialmente non ha un valore per un indice per agire.

Cosa puoi fare è questo:

db.data.ensureIndex({ "userId": 1, "myObject.a": 1 })
.

che mantiene un indice ascendente sulla proprietà "A" del tuo oggetto. Questo è utile se questo è regolarmente visualizzato nelle query.

Puoi anche avere problemi con le posizioni se si tenta di interrogare come questo:

db.data.find({ "Object": { a: "test2", b: "test" } })
.

dove i tasti memorizzati effettivi non sono in ordine. Ma questo è in genere fissato dalla forma "Dot Notation":

db.data.find({ "Object.a": "test2", "Object.b": "test" })
.

che non si preoccuperà dell'ordine effettivo dei tasti.

Ma l'indice che definito non mantiene i "tasti" nell'ordine di inserimento, che è completamente specifico del linguaggio

Altri suggerimenti

L'ordine è importante per gli indici sui sotto-documenti.Per citare la documentazione:

.

Questa query restituisce il documento di cui sopra.Quando si esegue l'uguaglianza Partite su Subdocuments, Esecuzione dell'ordine di campo e i sottodocumenti devono corrisponde esattamente.Ad esempio, la seguente query non corrisponde al Sopra documento

Considera questo documento:

{
  _id: ObjectId(...),
  metro: {
           city: "New York",
           state: "NY"
         },
  name: "Giant Factory"
}
.

E questo indice:

db.factories.ensureIndex( { metro: 1 } )
.

Queste partite di query:

db.factories.find( { metro: { city: "New York", state: "NY" } } )
.

E questo non è:

db.factories.find( { metro: { state: "NY", city: "New York" } } )
.

Vedi http://docs.mongodb.org/Manuale / nucleo / indice-singolo / # indici-on-subdocuments e http://docs.mongodb.org/manual./reference/method/db.collection.find/#query-subdocuments

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top