Mongo и Java: создание индексов для структуры агрегации

1

Ситуация: у меня есть коллекция с огромным количеством документов после сокращения карты (агрегация). Документы в коллекции выглядят следующим образом:

/* 0 */
{
    "_id" : {
        "appId" : ObjectId("1"),
        "timestamp" : ISODate("2014-04-12T00:00:00.000Z"),
        "name" : "GameApp",
        "user" : "[email protected]",
        "type" : "game"
    },
    "value" : {
        "count" : 2
    }
}

/* 1 */
{
    "_id" : {
        "appId" : ObjectId("2"),
        "timestamp" : ISODate("2014-04-29T00:00:00.000Z"),
        "name" : "ScannerApp",
        "user" : "[email protected]",
        "type" : "game"
    },
    "value" : {
        "count" : 5
    }
}

...

И я ищу в этой коллекции с помощью структуры агрегации:

db.myCollection.aggregate([match, project, group, sort, skip, limit]); // aggregation can return result on Daily or Monthly time base depends of user search criteria, with pagination etc...

Возможные критерии поиска:

1. {appId, timestamp, name, user, type} 
2. {appId, timestamp}
3. {name, user}

Я получаю правильный результат, именно то, что мне нужно. Но с оптимистической точки зрения у меня есть сомнения в индексировании.

Вопросов:

  1. Можно ли создавать индексы для такой коллекции?
  2. Как я могу создать индексы для такого объекта со сложным полем _id?
  3. Как я могу сделать аналог db.collection.find(). Explain(), чтобы проверить, какой индекс используется?
  4. И неплохо ли индексировать такую коллекцию или ее паранойю по производительности?

Подведение итогов:

  • MongoDB автоматически создает индекс по полю _id но это бесполезно в случае сложного поля _id как в примере. Для поля типа: _id: {name: "", timestamp: ""} вы должны использовать индекс следующим образом: *.ensureIndex({"_id.name": 1, "_id.timestamp": 1}) только после этого коллекция будет правильно проиндексирована полем _id.
  • Чтобы отслеживать, как ваши индексы работают с Mongo Aggregation, вы не можете использовать db.myCollection.aggregate().explain() и правильный способ сделать это:



db.runCommand({ 
        aggregate: "collection_name",
        pipeline: [match, proj, group, sort, skip, limit],
        explain: true 
    })
  • Мои тесты на локальном компьютере показывают, что такая индексация кажется хорошей идеей. Но для этого требуется больше тестов с большими коллекциями.
Теги:
aggregation-framework

1 ответ

1
Лучший ответ

Во-первых, индексы 1 и 3, вероятно, стоит исследовать. Что касается объяснения, вы можете передать объяснение в качестве опции для вашего конвейера. Вы можете найти документы здесь и пример здесь

  • 0
    Я видел этот документ, но db.myCollection.aggregate ([match, project, group, sort, skip, limit], {объяснение: true}) дает мне курсор без информации об индексах ... Но как я могу создать индексы для этой коллекции ?
  • 1
    В этих индексах нет ничего особенного. Вы можете найти, как создать их здесь .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню