Ответ 1
В вашем первом подходе вы не можете индексировать поля id, так как 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 по умолчанию.
см.
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}})
. если ты хотите использовать версию "идентификаторы как ключи", запрос существует, но он не будет индексироваться
Мы все еще можем использовать $exists для запроса id, но он не будет индексироваться