在批量更新中提供提示

Provide a hint in bulk upserts

有没有办法为 MongoDB / Python 中的批量更新插入提供提示?

我想在查询中添加提示,例如:Bulk.find(<query>).upsert().update(<update>)

我试过:

我是不是漏掉了什么?

这与其说是关于批量操作,不如说是关于 "update" 语句中查询的一般行为。参见 SERVER-1599

所以链接到 .find() has never been supported in update statements. This is also true of the Bulk API because the .find() 方法的基本 Op_Query 支持的相同操作格式有它自己的方法并且属于不相关的 Bulk API到基本的收集方法,因此缺少 .hint() 方法。

因此,即使使用 .update() 的基本形式,也无法使用与 $query 一样的特殊形式。但是从 MongoDB 2.6 开始,您可以做一些事情来影响查询选择的索引。

这里新增的是"index filters", this allows you to set up a list of indexes to be considered for a given "query shape". The main definition here is through the planCacheSetFilter命令。这允许您执行以下操作(为简洁起见,仅在 shell 中):

db.junk.ensureIndex({ "b": 1, "a": 1 })

db.runCommand({
    "planCacheSetFilter": "junk",
    "query": { "a": 1 },
    "indexes": [
        { "b": 1, "a": 1 }
    ]
})

"query" 参数中提供的值无关紧要,但重要的是 "shape"。所以无论查询什么数据,只要 "shape" 基本相同就可以考虑过滤器集。即:

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

$hint 的直接形式不同,这将与 .update() 语句一起使用或在 Bulk .find().update() 链中作为一种为查询操作提供索引选择的方式。

请注意,这不是 "permanent" 设置,也不能孤立于单个操作或操作序列。此 "filter" 将在设置后保留在计划缓存中,直到服务器实例重新启动。您也可以使用 planCacheClearFilters 命令清除它。

因此,在 JIRA Issue 得到解决之前,"filters" 是唯一可能的方式,就像您要求实现的那样,而不考虑其他查询以缩小其他过滤参数的范围以优化可能选择的指数.