sql >> Base de Datos >  >> NoSQL >> MongoDB

Esquema preferido de MongoDB para colecciones incrustadas. documentos frente a matrices

En su primer enfoque, no puede indexar los campos de identificación, ya que la identificación se usa como clave. Su tipo de acto como diccionario de valor clave. Este enfoque es útil si tiene el conjunto conocido de identificadores (por supuesto, menos número). Suponga que en su primer ejemplo, el identificador es bien conocido al principio,

>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

entonces, para encontrar los valores para el campo de identificación idk73716, puede hacerlo

 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

el {} vacío denota la consulta, y la segunda parte {'lines.idk73716':1} es un selector de consulta.

tener identificadores como claves tiene la ventaja de seleccionar solo el campo en particular. Aunque {'lines.idk73716':1} es un selector de campo, aquí sirve como consulta y selector. pero esto no se puede hacer en su segundo enfoque. Supongamos que la segunda colección es algo así

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

Y usted indexó la identificación del campo, por lo que si desea consultar por identificación

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

Al ver el resultado anterior, es visible que no hay forma de elegir solo los subdocumentos (incrustados) coincidentes, pero es posible en el primer enfoque. Este es el comportamiento predeterminado de mongodb.

ver

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

obtendrá todas las líneas, no solo idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Espero que esto ayude

EDITAR

Gracias a @Gates VP por señalar

Todavía podemos usar $exists para consultar la identificación, pero no será indexable