Возможно, я неправильно понял ваш вопрос, но я думаю, что именно в этом и заключаются сильные стороны 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 } })