MongoDB - 在数组中搜索和在普通键中搜索一样快吗?

els*_*ooo 6 indexing performance mongodb

说我有以下设计:

id | participant_ids
...| [ObjectId(...), ObjectId(...)]
Run Code Online (Sandbox Code Playgroud)

现在我以这种方式查询它:

db.events.find({
    participant_ids: ObjectId(...)
});
Run Code Online (Sandbox Code Playgroud)

与此相同:

db.events.find({
    participant_ids: {
        $in: ObjectId(...)
    }
});
Run Code Online (Sandbox Code Playgroud)

我假设这两者之间的表现没有差别(但如果我错了,请纠正我!).


对于每个活动,至少有1个参与者,最多2个参与者.所以我也可以使用以下设计:

id | participant_1_id | participant_2_id
Run Code Online (Sandbox Code Playgroud)

...并像这样查询...:

db.events.find({
    $or: {
        participant_1_id: ObjectId(...),
        participant_2_id: ObjectId(...)
    }
});
Run Code Online (Sandbox Code Playgroud)

如果我不使用索引,这可能并没有真正有所作为,但是 - 当然 - 我是.

对于第一个设计,我使用以下索引:

db.events.ensureIndex({
    participant_ids: 1
});
Run Code Online (Sandbox Code Playgroud)

对于第二个,我跟这个:

db.events.ensureIndex({
    participant_1_id: 1,
    participant_2_id: 1
});
Run Code Online (Sandbox Code Playgroud)

当你看他们的表现时,两者都有缺点.

  • 第一个查询:使用a Array可能比使用普通键慢.
  • 第二个查询:使用$or-operator不是很快.
  • 第二个查询:不是很可扩展,说我想在某个时候释放参与者的限制,这是不可能的(你$or在查询的部分有无限的密钥和无限的项目).

我的问题是: - 我应该使用什么样的设计?- 我可以索引Array吗?文档没有说明这一点,我不确定Array是什么(因为它们的内容可以变化很大).

Thi*_*ilo 5

第一个查询:使用数组可能比使用普通键慢.

我不这么认为.如果您有一个值("普通键")或多个("数组"),它应该是完全相同的基于索引的访问路径.

participant_1_id, participant_2_id 太可怕了.