如何在MongoCollection.Update()中使用索引

时间:2014-03-27 20:29:40

标签: mongodb mongodb-.net-driver

我正在编写一个方法来更新非常大的MongoCollection中的单个文档, 我有一个索引,我希望MongoCollection.Update()调用可以大大减少查找时间,但我似乎找不到像MongoCursor.SetHint(string indexName)这样的东西。

是否可以在更新操作中使用索引?
如果是这样,怎么样?

2 个答案:

答案 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仍然使用它,因为你这么说。