Запрос MongoDB в индексированном поле навсегда возвращает простой счетчик [duplicate]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

8
задан bantic 18 November 2011 в 02:29
поделиться

3 ответа

Нет, нет способа сказать mongodb использовать индекс для существующего запроса. Индексирование полностью связано с данными. Поскольку $ существует, он связан только с ключами (полями), которые он не может использовать в индексах.

$ существует только проверяет, существует ли данный документ (или поле) в документе.

12
ответ дан RameshVel 28 August 2018 в 13:18
поделиться

Так как запросы MongoDB 2.0 $exists должны использовать индекс. К сожалению, это исправление исчезло в новейшей версии и будет исправлено в MongoDB 2.5

3
ответ дан High6 28 August 2018 в 13:18
поделиться

$ 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
        }
]

Надеюсь помочь!

6
ответ дан jianpx 28 August 2018 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: