Допустим, у меня следующий дизайн:
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
});
У обоих есть недостатки, если посмотреть на их характеристики.
, вероятно, медленнее, чем использование простого ключа. $ или
-оператора не очень быстро. $ или
-часть запросов). Мои вопросы:
- Какой дизайн использовать?
- Могу ли я проиндексировать массив
s? В документации об этом ничего не говорится, и я не уверен, что Array
являются такими (поскольку их содержимое может сильно различаться).