Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
Нет, нет способа сказать mongodb использовать индекс для существующего запроса. Индексирование полностью связано с данными. Поскольку $ существует, он связан только с ключами (полями), которые он не может использовать в индексах.
$ существует только проверяет, существует ли данный документ (или поле) в документе.
Так как запросы MongoDB 2.0 $exists
должны использовать индекс. К сожалению, это исправление исчезло в новейшей версии и будет исправлено в MongoDB 2.5
$ exist не будет использовать индекс, но вы можете изменить свою структуру данных на
photos: [
{id:123, url: '...', title: '...', ... },
{id:456, url: '...', title: '...', ... },
...
]
, а затем использовать
db.users.ensureIndex({photos.id:1})
для создания индекса для идентификатора фотографии.
Кажется, я ошибаюсь, на самом деле вы можете заставить свой запрос $ exist использовать ваш индекс. Давайте продолжим использовать приведенную выше структуру, но ваш идентификатор фотографии, конечно, не содержится, то есть некоторые документы будут иметь ключ «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
}
]
Надеюсь помочь!