Запрос пользовательского ключа и значения MongoDb с помощью Index - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь сохранить данные значения ключа в MongoDb. Ключ может быть любой строкой, и я больше ничего о ней не знаю до сохранения, значение может быть любого типа (int, string, array).И я хотел бы иметь индекс для такого ключа & значения .

Я искал ( Индекс нескольких ключей ) по массивуиз моих key-vals , но похоже, что он не может покрывать запросы к полям массива.

Возможно ли иметь индекс для пользовательского ключа & значение в mongoDb и выполнять запросы с такими операциями, как $ существующие и $ eq и $ gte, $lte, $ и, $ или, $ без COLLSCAN, но через этап IXSCAN?А может мне для этого нужен еще один БД?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Возможно, я неправильно понял ваш вопрос, но я думаю, что именно в этом и заключаются сильные стороны MongoDB - работа с документами разной формы и типами данных.

Итак, давайте предположим, что вам нужно выполнить следующие два документа:

db.test.insertMany([
    {
        key: "test",
        value: [ "some array", 1 ]
    },
    {
        key: 12.7,
        values: "foo"
    }
])

, и вы создаете составной индекс, например:

db.test.createIndex({
    "key": 1,
    "value": 1
})

, тогда следующий запрос будет использовать этот индекс:

db.test.find({ "key": "test", "value": 1 })

, а такжеболее сложные запросы будут делать то же самое:

db.test.find({ "key": { $exists: true }, "value": { gt: 0 } })

Вы можете проверить это, добавив .explain() в конец вышеупомянутых запросов.

ОБНОВЛЕНИЕ на основе вашего комментария:

Для этого вам не нужна структура агрегации.Вы можете просто сделать что-то вроде этого:

db.test.distinct("user_id", { "key": { $exists: true } })

В этом запросе будет использоваться вышеуказанный индекс.Более того, это можно сделать еще быстрее, изменив определение индекса, включив в него поле "user_id", например:

db.test.createIndex({
    "key" : 1.0,
    "value" : 1.0,
    "user_id" : 1
})

Это можно проверить, выполнив следующий запрос:

db.test.explain().distinct("user_id", { "key": { $exists: true } })
0 голосов
/ 03 октября 2018

Если ваш key может быть любым произвольным значением, то это невозможно.Лучше всего создать индекс для какого-либо другого известного поля, чтобы ограничить первоначальные результаты, чтобы влияние неизбежного сканирования коллекции было сведено к минимуму.

...