说我有以下设计:
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
});
当你看到他们的表现时,两者都有缺点。
Array
可能比使用普通密钥慢。$or
- 运算符的速度不是很快。$or
- 部分查询。)我的问题是:
- 我应该使用什么样的设计?
- 我可以索引Array
吗?文档没有说明这一点,我不确定Array
是什么(因为它们的内容可能会有很大不同)。
答案 0 :(得分:5)
第一个查询:使用数组可能比使用普通键慢。
我不这么认为。如果您有一个值(“普通键”)或多个(“数组”),它应该是完全相同的基于索引的访问路径。
participant_1_id, participant_2_id
真可怕。