При первом подходе вы не можете индексировать поля 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"
}
] }
>
И вы проиндексировали идентификатор поля, поэтому, если вы хотите выполнить запрос по идентификатору
> 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.
see
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 за указание
db.your_collection.find({'lines.idk73716':{$exists:true}})
.Если вы хотите использовать версию «идентификаторы как ключи», запрос на существование будет работать, но он не будет индексируемым
Мы все еще можем использовать $ существующие для запроса идентификатора, но он не будетиндексируемая