我正在尝试跨mongo集合进行搜索,然后根据搜索更新任何匹配项。这允许将来的搜索仅在不匹配的项目之间运行。
我有~20k searchItem
个对象可以浏览~4M项目。
集合如下
SearchItem {
_id
valueA
valueB
}
Item {
matchIds
valueA
valueB
valueC
}
我的查询正在进行
db.Item.update( {
valueA: SearchItem.valueA,
valueB: SearchItem.valueB,
matchIds: {
$ne: SearchItem._id
}
},
{
$addToSet:
{
matchIds: SearchItem._id
}
}, false, true)
这有效;但是这个查询运行时间太长,因为它在单个项目上找到了多达300K的匹配。它然后锁定并导致超时异常基本上炸毁了系统。
我感兴趣的是,如果有更好的方法来执行这些搜索,同时保留以前搜索过的内容的知识,或者是否有更好的方法来执行这些更新,从而减少了避免大量锁定所需的时间。 / p>
我有valueA
,valueB
和valueC
的索引,查询并不总是只有valueA & valueB
所以放置复合索引以便更快搜索会导致propertyNumber ^ 2个索引,不是很好。
MongoDb
版本是V2.4.9和官方C#驱动程序V1.8.3。