我在一个相当大的mongodb集合中有以下文档结构(大约1000万个文档):
{
_id: <ObjectId>,
p: [
"user A"
"user B"
],
data: "not important"
}
“p”字段表示其所属数据的两个用户ID(将其视为成对用户之间的对话集合)。它始终是一个包含2个用户ID的数组,并且是唯一的(没有其他文档在其“p”字段中具有相同的用户对)。
我在这个字段上有一个索引:
{
"v" : 1,
"key" : {
"p" : 1
},
"ns" : "mydb.messages",
"name" : "p_1",
"background" : true,
"safe" : true
}
问题是当我在我的应用程序中进行查找时,mongodb正在扫描所有可能的行。例如,用户A可能有2800个其他会话,当我执行以下查询只是为了找到与其他特定用户的对话时,它会扫描所有2800行:
db.messages.find({p: ["user A", "user B"]});
这是解释输出:
{
"cursor" : "BtreeCursor p_1 multi",
"isMultiKey" : true,
"n" : 0,
"nscannedObjects" : 2805,
"nscanned" : 2806,
"nscannedObjectsAllPlans" : 2805,
"nscannedAllPlans" : 2806,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 23,
"indexBounds" : {
"p" : [
[
"user A",
"user A"
],
[
[
"user A",
"user B"
],
[
"user A",
"user B"
]
]
]
},
"server" : "ip-10-237-195-23:27017"
}
为了便于阅读,我已经为用户A和用户B提供了实际的用户ID字符串。
由于存在大量这些查询,因此严重拖累了性能。我假设我没有正确索引字段,或者索引在包含数组的字段上没有按预期执行。在任何情况下,非常感谢任何帮助。