我正在编写一个方法来更新非常大的MongoCollection
中的单个文档,
我有一个索引,我希望MongoCollection.Update()
调用可以大大减少查找时间,但我似乎找不到像MongoCursor.SetHint(string indexName)
这样的东西。
是否可以在更新操作中使用索引?
如果是这样,怎么样?
答案 0 :(得分:1)
您可以根据更新命令的index
部分创建query
。
例如,如果您有此集合,名为data
:
> db.data.find()
{ "_id" : ObjectId("5334908bd7f87918dae92eaf"), "name" : "omid" }
{ "_id" : ObjectId("5334943fd7f87918dae92eb0"), "name" : "ali" }
{ "_id" : ObjectId("53349478d7f87918dae92eb1"), "name" : "reza" }
如果你这样做更新查询:
> db.data.update(query={name:'ali'}, update={name: 'Ali'})
没有任何已定义的索引,扫描的文档数为2
:
"nscanned" : 2,
但是,如果您根据query
定义索引,则name
字段:
db.data.ensureIndex({name:1})
现在,如果你再次更新它:
> db.data.update(query={name:'Ali'}, update={name: 'ALI'})
Mongodb使用您的索引进行更新,扫描文档的数量为1
:
"nscanned" : 1,
但是如果您想要hint
进行更新,可以提示您查询:
# Assume that the index and field of it exists.
> var cursor = db.data.find({name:'ALI'}).hint({family:1})
然后在更新查询中使用它:
> db.data.update(query=cursor, update={name: 'ALI'})
答案 1 :(得分:-1)
如果您已将索引编入索引,则更新将立即使用CORRECT索引。没有必要提供提示(事实上你是can't hint with update)。
Hint仅用于调试和测试目的。在大多数情况下,Mongo足够聪明,可以自动决定在特定查询中使用哪个索引(如果你有很多索引),并且不时检查它的策略。
如此简短的回答 - 什么也不做。如果你有一个索引并且它很有用,它将自动用于find,update,delete,findOne。
如果您想查看它是否已被使用 - 请查询搜索某些内容的部分,然后使用explain查找。
hellboy的例子。这只是一个例子,在现实生活中它可能更复杂。
所以你有一个包含这个{a : int, b : timestamp}
的文档的集合。您有2个索引:一个在a
上,另一个在b
上。所以现在你需要像>那样进行查询。 5和b是在2014之后。由于某种原因,它使用索引a
,这不会给你更快的时间(可能是因为你有1000个元素,其中大多数都大于5,只有10个> 2004年)。所以你决定暗示使用b
索引。酷现在工作得更快。但是你的收藏发生了变化,现在你已经到了2020年,你的大部分文件都比2014年还要大。所以现在你的索引b
没有那么多工作。但mongo仍然使用它,因为你这么说。