提供批量upserts的提示

时间:2015-01-12 18:27:53

标签: python mongodb mongodb-query pymongo

有没有办法在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)。

我错过了什么吗?

1 个答案:

答案 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;是唯一可行的方式,就像你要求实现的那样,不考虑其他查询来缩小额外的过滤参数以优化可能选择的索引。