Nel tuo primo approccio non puoi indicizzare i campi id, poiché id utilizzato come chiave. È un po' come un dizionario dei valori chiave. Questo approccio è utile se hai l'insieme noto di id (ovviamente meno numero). Supponi che nel tuo primo esempio l'id sia ben noto a fronte ,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
quindi per trovare i valori per il campo id idk73716, puoi farlo con
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
il vuoto {} indica la query e la seconda parte {'lines.idk73716':1} è un selettore di query.
avere ID come chiavi con il vantaggio di selezionare solo il campo particolare. Anche se {'lines.idk73716':1} è un selettore di campo, qui funge da query e selettore. ma questo non può essere fatto nel tuo secondo approccio. Supponiamo che la seconda raccolta sia più o meno così
> 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 hai indicizzato l'id del campo, quindi se vuoi eseguire una query per 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"
}
] }
>
vedendo l'output sopra, è visibile che non c'è modo di selezionare da soli i documenti sub(embedded) corrispondenti, ma è possibile nel primo approccio. Questo è il comportamento predefinito di mongodb.
vedi
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
recupererà tutte le righe, non solo idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Spero che questo aiuti
MODIFICA
Grazie a @Gates VP per segnalare
Possiamo ancora usare $exists per interrogare l'id, ma non sarà indicizzabile