快速总结:
我有一个文档集合,其中每个文档都有一个名称数组;当用户输入姓名列表时,我想在文档的姓名列表中查找所有用户输入姓名的所有文档。命中索引会更好,因为我们当前使用的策略需要几秒钟。
背景:
我正在尝试提高我们对患者姓名的查询的性能。人名很复杂,给我带来了两个大问题:
- 人们有多个名字。或者也许他们没有。他们可能会以随机顺序给他们
- 人名不区分大小写(至少,我们假设对他们的查询不应该是),并且 mongodb 目前不支持不区分大小写的索引。
为了解决问题 #1,我们将患者姓名拆分并将其存储为数组。为了解决问题 #2,我们在拆分之前将名称小写。我们还按字典顺序对数组进行排序(不确定这是否需要?)。
所以这些“名字”在我们的文档中都变成了 ["dupe", "uid"]:
- “UID^DUPE”
- “UID,骗子”
- “UID 欺骗”
- “欺骗 UID”
然后,我们可以进行一个将命中索引的查询:
db.mycollection.find({"data.crunchedName":/^dup/}, {_id:0, "data.crunchedName":1}).explain()
根据 explain() 命中索引:
{
"cursor" : "BtreeCursor data.crunchedName_ multi",
"nscanned" : 13,
"nscannedObjects" : 12,
"n" : 12,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"data.crunchedName" : [
[
"dup",
"duq"
],
[
/^dup/,
/^dup/
]
]
}
}
尽管无论出于何种原因,我都无法将其显示为“仅索引”。我认为这在实践中并不重要。
如果我尝试使用 $and 绑定多个名称,则只有第一个名称会命中索引。因此,根据名称的顺序,存在潜在的性能差异。我认为这一定是因为没有办法在列表中的成对事物上指定索引。我不确定您是否愿意这样做,因为索引会很大。
我的实际问题:
这是一个体面的方法吗?如果用户决定键入“S Alexander”之类的内容,是否还有其他选项不会出现性能问题?有没有一些我找不到的使用 mongo 解决这个问题的规范方法?