MongoDB - Является ли поиск в массивах таким же быстрым, как поиск по простым ключам?

Допустим, у меня следующий дизайн:

id | participant_ids
...| [ObjectId(...), ObjectId(...)]

Теперь я запрашиваю его таким образом:

db.events.find({
    participant_ids: ObjectId(...)
});

Что идентично этому:

db.events.find({
    participant_ids: {
        $in: ObjectId(...)
    }
});

Я полагаю, что нет никакой разницы по производительности между этими двумя (но поправьте меня, если я ошибаюсь!).


В каждом мероприятии есть от 1 до 2 участников. Так что я мог бы также использовать следующий дизайн:

id | participant_1_id | participant_2_id

... и запросить его вот так ...:

db.events.find({
    $or: {
        participant_1_id: ObjectId(...),
        participant_2_id: ObjectId(...)
    }
});

Если бы я не использовал индексирование, это, вероятно, действительно не имело бы значения, но - конечно - Да.

Для первого проекта я выберу следующий индекс:

db.events.ensureIndex({
    participant_ids: 1
});

Для второго я выберу следующее:

db.events.ensureIndex({
    participant_1_id: 1,
    participant_2_id: 1
});

У обоих есть недостатки, если посмотреть на их характеристики.

  • ] 1-й запрос: Использование массива , вероятно, медленнее, чем использование простого ключа.
  • 2-й запрос: Использование $ или -оператора не очень быстро.
  • 2-й запрос: Не очень масштабируемый, скажем, я когда-нибудь захочу освободить лимит участников, это будет невозможно (у вас будет неограниченное количество ключей и неограниченное количество элементов в $ или -часть запросов).

Мои вопросы: - Какой дизайн использовать? - Могу ли я проиндексировать массив s? В документации об этом ничего не говорится, и я не уверен, что Array являются такими (поскольку их содержимое может сильно различаться).

6
задан elslooo 10 August 2011 в 10:31
поделиться