$ Существующий не будет использовать индекс, но вы можете изменить структуру данных на
photos: [
{id:123, url: '...', title: '...', ... },
{id:456, url: '...', title: '...', ... },
...
]
, а затем использовать
db.users.ensureIndex({photos.id:1})
для создания индекса для идентификатора фотографии.
Кажется, я ошибаюсь, на самом деле, вы можете заставить ваш запрос $ существующие использовать ваш индекс.Давайте продолжим использовать вышеупомянутую структуру, но ваш идентификатор фотографии не обязательно содержится, то есть некоторые документы будут иметь ключ 'id', а некоторые - нет.Затем вы можете создать разреженный индекс для него:
db.users.ensureIndex({'photos.id': 1}, {'sparse': true})
, а затем выполнить запрос следующим образом:
db.users.find({'photos.id': {$exists: true}}).hint({'photos.id': 1})
, который вы можете добавить объяснение, чтобы увидеть, использует ли запрос индекс.Вот мой результат, мобильный ключ моей коллекции похож на ваш photos.id:
> db.test.count()
50000
> db.test.find({'mobile': {$exists: true}}).hint({'mobile': 1}).explain()
{
"cursor" : "BtreeCursor mobile_1",
"nscanned" : 49999,
"nscannedObjects" : 49999,
"n" : 49999,
"millis" : 138,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"mobile" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
> db.test.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.test",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"mobile" : 1
},
"ns" : "test.test",
"name" : "mobile_1",
"sparse" : true,
"background" : true
}
]
Надеюсь на помощь!