有没有办法在MongoDB / Python中为批量中的upsert提供提示?
我想在查询中添加提示,例如:Bulk.find(<query>).upsert().update(<update>)
。
我试过了:
Bulk.find(<query>).hint(<index>).upsert().update(<update>)
:.hint()
方法不存在。Bulk.find({'$query': <query>, '$hint': <hint>}).upsert().update(<update>)
:不能将{$query: <query>}
语法与方法链混合使用(例如,请参阅this&amp; this)。我错过了什么吗?
答案 0 :(得分:4)
这不是关于批量操作,而是关于&#34;更新&#34;中查询的一般行为。声明。请参阅SERVER-1599。
因此,更新语句从未支持与.find()
链接的基本Op_Query
支持的相同操作格式。对于Bulk API也是如此,因为.find()
方法有它自己的方法,属于Bulk API,它与基本集合方法无关,因此缺少$query
1}}方法。
因此,使用与"index filters"一样的特殊表单即使在基本表单中使用.hint()
也不起作用。但是,MongoDB 2.6可以做一些事情来影响查询选择的索引。
这里的新增加是planCacheSetFilter,这允许您设置要为给定的&#34;查询形状&#34;考虑的索引列表。这里的主要定义是通过$hint
命令。这允许你做类似以下的事情(为简洁起见,只是在shell中):
.update()
&#34;查询&#34;中提供的值论证是无关紧要的,但重要的是&#34;形状&#34;。因此无论要查询什么数据,只要&#34;形状&#34;基本相同,然后考虑过滤器集。即:
db.junk.ensureIndex({ "b": 1, "a": 1 })
db.runCommand({
"planCacheSetFilter": "junk",
"query": { "a": 1 },
"indexes": [
{ "b": 1, "a": 1 }
]
})
与planCacheClearFilters的直接形式不同,这将与db.junk.find({ "a": 1 }).explain(1).filterSet; // returns true
db.junk.find({ "a": 2 }).explain(1).filterSet; // returns true
db.junk.find({ "b": 1 }).explain(1).filterSet; // returns false, different shape
语句或Bulk .update()
链一起使用,作为为查询操作提供索引选择的方法。
请注意,这不是永久性的&#34;设置,也不能被隔离到单一操作或操作序列。这个&#34;过滤器&#34;一旦设置,将保留在计划缓存中,直到重新启动服务器实例。您可以使用JIRA Issue命令将其清除。
所以,直到{{3}}得到解决,&#34;过滤&#34;是唯一可行的方式,就像你要求实现的那样,不考虑其他查询来缩小额外的过滤参数以优化可能选择的索引。