在批量更新插入中提供提示

Pie*_*rre 3 python mongodb pymongo mongodb-query

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

我想在这样一个查询添加一个提示: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>}语法与方法链混合使用(例如,请参阅)。

我错过了什么吗?

Nei*_*unn 5

这不是关于批量操作,而是关于“更新”语句中查询的一般行为。请参阅SERVER-1599

因此,更新语句中从未支持Op_Query链接到的基本支持的相同格式的操作.find()Bulk API也是如此,因为.find()那里的方法是它自己的方法,属于 Bulk API,它与基本集合方法无关,因此缺少.hint()方法。

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

这里新增的是“索引过滤器”,它允许您为给定的“查询形状”设置要考虑的索引列表。这里的主要定义是通过planCacheSetFilter命令。这允许您执行以下操作(为简洁起见,仅在 shell 中):

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

db.runCommand({
    "planCacheSetFilter": "junk",
    "query": { "a": 1 },
    "indexes": [
        { "b": 1, "a": 1 }
    ]
})
Run Code Online (Sandbox Code Playgroud)

“查询”参数中提供的值无关紧要,但重要的是“形状”。所以无论查询什么数据,只要“形状”基本相同,就考虑过滤器集。IE:

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
Run Code Online (Sandbox Code Playgroud)

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

请注意,这不是“永久”设置,也不能与单个操作或操作序列隔离。此“过滤器”一旦设置将保留在计划缓存中,直到服务器实例重新启动。您可以交替使用planCacheClearFilters命令清除它。

因此,在解决JIRA 问题之前,“过滤器”是您要求实现的唯一可能方式,而无需考虑其他查询以缩小其他过滤参数以优化可能选定的索引。