Pregunta

con un índice compuesto como el siguiente

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

¿Se encuentra el siguiente uso este índice?

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

Sé que en JavaScript que los objetos no preservan su orden, ¿esto es lo mismo en Mongo?

Entonces, qué pasará si tengo documentos con objetos en diferentes órdenes como este.

{
  _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'
  }
}

¿El orden de las propiedades importan al indexar un objeto como arriba?

Editar: En la documentación, http://docs.mongodb.org/manual/core/index-Solo / dice "Al realizar coincidencias de igualdad en los subdocumentos, los asuntos de orden de campo y los subdocumentos deben coincidir exactamente."

y en su ejemplo, lo siguiente funcionaría

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

Pero si los campos de metro estaban al revés, no funcionará

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

Entonces, ¿cómo preserva la orden de la propiedad en JavaScript / nodo cuando el idioma en sí no lo admite?

¿Fue útil?

Solución

En realidad, los objetos de notación de Javasscript o JSON preservan su orden. Si bien algunas propiedades de nivel superior pueden alearse si MongoDB tiene que moverlas a medida que un documento crece, en general, este documento de "sub-nivel" no debe cambiar del orden en que se insertó originalmente.

Dicho esto, algunos idiomas intentan ordenar su "hash", "MAP", teclas "DICT" de forma predeterminada y, por lo tanto, se vuelve importante encontrar y "ordenar" o el formulario "indexado" cuando se trata de estos, pero eso es otro tema.

Para su pregunta de un "índice" para MongoDB que afecta a este orden, no, no lo hace. De hecho, el índice que ha agregado, aunque no se compra como tal, en realidad no tiene ningún valor, ya que un Object o {} esencialmente no tiene un valor para que un índice actúe.

Lo que puedes hacer es esto:

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

que mantiene un índice ascendente en la propiedad "A" de su objeto. Eso es útil si esto se ve regularmente en consultas.

También puede tener problemas con las posiciones si intenta consultar así:

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

donde las llaves almacenadas reales no están en orden. Pero esto suele ser fijo por la forma de "notación de puntos":

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

que no se preocupará por el orden real de las llaves.

Pero el índice que definió no mantiene las "llaves" en el orden de inserción, que es totalmente específico del idioma

Otros consejos

El pedido es importante para los índices en subdoccion.Para citar la documentación:

Esta consulta devuelve el documento anterior.Al realizar la igualdad coincidencias en los subdocumentos, los asuntos de orden de campo y los subdocumentos deben coincide exactamente.Por ejemplo, la siguiente consulta no coincide con la Documento anterior

Considere este documento:

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

y este índice:

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

Esta consulta coincide:

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

y este no:

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

ver http://docs.mongodb.org/Manual / Núcleo / Index-Single / # Índices-ON-Subdocuments y http://docs.mongodb.org/manual/ referencias/method/db.collection.find/#query-subdocuments

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top