W pierwszym podejściu nie możesz indeksować pól id, ponieważ id jest używane jako klucz. Jest to rodzaj działania jak słownik kluczowych wartości. To podejście jest przydatne, jeśli masz znany zestaw identyfikatorów (oczywiście mniejszą liczbę). Załóżmy, że w pierwszym przykładzie identyfikator jest dobrze znany z przodu,
>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}
więc aby znaleźć wartości dla pola identyfikatora idk73716, możesz to zrobić za pomocą
db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }
puste {} oznacza zapytanie, a druga część {'lines.idk73716':1} to selektor zapytania.
posiadanie identyfikatorów jako kluczy ma tę zaletę, że wybiera tylko konkretne pole. Mimo że {'lines.idk73716':1} jest selektorem pola, tutaj służy jako zapytanie i selektor. ale nie można tego zrobić w twoim drugim podejściu. Załóżmy, że druga kolekcja wygląda podobnie
> 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"
}
] }
>
I zindeksowałeś identyfikator pola, więc jeśli chcesz zapytać według identyfikatora
> 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"
}
] }
>
widząc powyższe wyniki, widać, że nie ma sposobu, aby wybrać pasujące dokumenty podrzędne (osadzone), ale jest to możliwe w pierwszym podejściu. Jest to domyślne zachowanie mongodb.
patrz
db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})
pobierze wszystkie linie, nie tylko idk73716
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
Mam nadzieję, że to pomoże
EDYTUJ
Podziękowania dla @Gates VP za wskazanie
Nadal możemy użyć $exists do zapytania o identyfikator, ale nie będzie on indeksowany