При първия си подход не можете да индексирате полетата за id, тъй като id се използва като ключ. Действа като речник на ключовите стойности. Този подход е полезен, ако имате известния набор от идентификатори (разбира се, по-малък брой). Да приемем, че в първия ви пример идентификаторът е добре известен отпред,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
така че за да намерите стойностите за id поле idk73716, можете да направите това чрез
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
празният {} обозначава заявката, а втората част {'lines.idk73716':1} е селектор на заявка.
имащи идентификатори като ключове, които имат предимството да избират само конкретното поле. Въпреки че {'lines.idk73716':1} е селектор на поле, тук той служи като заявка и селектор. но това не може да се направи във вашия втори подход. Да приемем, че втората колекция е нещо като това
> 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"
}
] }
>
И индексирахте id на полето, така че ако искате да правите заявка по 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"
}
] }
>
виждайки горния изход, се вижда, че няма начин да изберете само съвпадащите под(вградени) документи, но е възможно при първия подход. Това е поведението по подразбиране на mongodb.
вижте
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
ще извлече всички редове, а не само idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Надявам се това да помогне
РЕДАКТИРАНЕ
Благодарение на @Gates VP за посочване
Все още можем да използваме $exists за заявка за идентификатора, но той няма да може да се индексира