I ditt första tillvägagångssätt kan du inte indexera id-fälten, eftersom id används som nyckel. Dess typ av agera som nyckelvärdeslexikon. Det här tillvägagångssättet är användbart om du har den kända uppsättningen ID (naturligtvis mindre antal). Anta att i ditt första exempel är ID:t välkänt längst fram ,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
så för att hitta värdena för id-fältet idk73716 kan du göra detta genom att
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
den tomma {} anger frågan, och den andra delen {'lines.idk73716':1} är en frågeväljare.
att ha ID som nycklar med fördelen att välja det specifika fältet enbart. Även om {'lines.idk73716':1} är en fältväljare, fungerar den här som en fråga och väljare. men detta kan inte göras i ditt andra tillvägagångssätt. Anta att den andra samlingen är ungefär så här
> 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"
}
] }
>
Och du indexerade fält-id, så om du vill fråga 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"
}
] }
>
genom att se ovanstående utdata, är det synligt att det inte finns något sätt att välja de matchande sub(inbäddade) dokumenten ensam, men det är möjligt i den första metoden. Detta är standardbeteendet för mongodb.
se
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
kommer att hämta alla rader, inte bara idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Hoppas detta hjälper
REDIGERA
Tack till @Gates VP för att påpeka
Vi kan fortfarande använda $exists för att fråga id, men det kommer inte att kunna indexeras