In uw eerste benadering kunt u de id-velden niet indexeren, aangezien id als sleutel wordt gebruikt. Het is een soort van handelen als een sleutelwaardewoordenboek. Deze aanpak is handig als je de bekende set id's hebt (natuurlijk minder aantal).
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
dus om de waarden voor id-veld idk73716 te vinden, kunt u dit doen door
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
de lege {} geeft de query aan en het tweede deel {'lines.idk73716':1} is een queryselector.
met id's als sleutels met het voordeel dat je alleen het specifieke veld kunt kiezen. Hoewel {'lines.idk73716':1} een veldselector is, dient het hier als een query en selector. maar dit kan niet worden gedaan in uw tweede benadering. Stel dat de tweede verzameling er ongeveer zo uitziet
> 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"
}
] }
>
En je hebt de veld-ID geïndexeerd, dus als je wilt zoeken op 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"
}
] }
>
door de bovenstaande uitvoer te zien, is het zichtbaar dat er geen manier is om de overeenkomende sub (ingebedde) documenten alleen te kiezen, maar het is mogelijk in de eerste benadering. Dit is het standaardgedrag van mongodb.
zie
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
haalt alle regels op, niet alleen idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Ik hoop dat dit helpt
BEWERKEN
Met dank aan @Gates VP om erop te wijzen
We kunnen nog steeds $exists gebruiken om de id op te vragen, maar deze zal niet indexeerbaar zijn