I din første tilgang kan du ikke indeksere id-felterne, da id bruges som nøgle. Dens slags fungerer som nøgleværdiordbog. Denne tilgang er nyttig, hvis du har det kendte sæt af id'er (selvfølgelig mindre antal). Antag i dit første eksempel, at id'et er velkendt foran ,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
så for at finde værdierne for id-feltet idk73716, kan du gøre dette ved at
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
den tomme {} angiver forespørgslen, og den anden del {'lines.idk73716':1} er en forespørgselsvælger.
at have id'er som nøgler med en fordel ved at vælge det bestemte felt alene. Selvom {'lines.idk73716':1} er en feltvælger, fungerer den her som en forespørgsel og vælger. men dette kan ikke gøres i din anden tilgang. Antag, at den anden samling er sådan her
> 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"
}
] }
>
Og du indekserede felt-id'et, så hvis du vil forespørge efter 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"
}
] }
>
ved at se ovenstående output, er det synligt, at der ikke er nogen måde at vælge de matchende under(indlejrede) dokumenter alene, men det er muligt i den første tilgang. Dette er standardadfærden for mongodb.
se
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
vil hente alle linjer, ikke kun idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Håber dette hjælper
REDIGER
Tak til @Gates VP for at påpege
Vi kan stadig bruge $exists til at forespørge på id'et, men det vil ikke kunne indekseres