Em sua primeira abordagem, você não pode indexar os campos id, pois id é usado como chave. Seu tipo de ato como dicionário de valor-chave. Esta abordagem é útil se você tiver o conjunto conhecido de ids (obviamente menos número). Assuma que em seu primeiro exemplo o id é bem conhecido em front ,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
então, para encontrar os valores do campo id idk73716, você pode fazer isso
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
o {} vazio denota a consulta e a segunda parte {'lines.idk73716':1} é um seletor de consulta.
ter ids como chaves com a vantagem de escolher apenas o campo específico. Embora {'lines.idk73716':1} seja um seletor de campo, aqui ele serve como consulta e seletor. mas isso não pode ser feito em sua segunda abordagem. Suponha que a segunda coleção seja mais ou menos assim
> 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"
}
] }
>
E você indexou o id do campo, então se você quiser consultar pelo id
> 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"
}
] }
>
vendo a saída acima, é visível que não há como escolher os documentos sub (incorporados) correspondentes sozinhos, mas é possível na primeira abordagem. Este é o comportamento padrão do mongodb.
Vejo
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
irá buscar todas as linhas, não apenas idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Espero que isto ajude
EDITAR
Obrigado a @Gates VP por apontar
Ainda podemos usar $exists para consultar o id, mas não será indexável