Ve vašem prvním přístupu nemůžete indexovat pole id, protože id se používá jako klíč. Svým způsobem působí jako slovník klíčových hodnot. Tento přístup je užitečný, pokud máte známou sadu id (samozřejmě menší počet). Předpokládejme, že ve vašem prvním příkladu je id dobře známé na začátku,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
Chcete-li tedy najít hodnoty pro pole id idk73716, můžete to provést pomocí
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
prázdné {} označuje dotaz a druhá část {'lines.idk73716':1} je selektor dotazu.
mají id jako klíče a mají výhodu vybrat konkrétní pole samostatně. I když je {'lines.idk73716':1} selektorem polí, zde slouží jako dotaz a selektor. ale to nelze udělat ve vašem druhém přístupu. Předpokládejme, že druhá kolekce je podobná této
> 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"
}
] }
>
A indexovali jste id pole, takže pokud chcete dotazovat podle 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"
}
] }
>
když vidíte výše uvedený výstup, je vidět, že neexistuje způsob, jak vybrat odpovídající dílčí (vložené) dokumenty samostatně, ale je to možné v prvním přístupu. Toto je výchozí chování mongodb.
viz
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
načte všechny řádky, nejen idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Doufám, že to pomůže
UPRAVIT
Díky @Gates VP za upozornění
Stále můžeme použít $exists k dotazu na id, ale nebude indexovatelné