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