Bulk.find.arrayFilters()
说明
Bulk.find.arrayFilters(<array of filter documents>)
确定对数组字段进行更新操作时要修改哪些数组元素:
Bulk.find(<query>).arrayFilters([ <filter1>, ... ]).updateOne(<update>); Bulk.find(<query>).arrayFilters([ <filter1>, ... ]).update(<update>); 在更新文档中,使用经过
$[<identifier>]
过滤的位置操作符定义一个标识符,然后在大量过滤文档中引用该标识符。 如果更新文档中未包含某个标识符,则无法获得该标识符的大量过滤文档。<identifier>
必须以小写字母开头,且只能包含字母数字字符。您可以在更新文档中多次包含相同的标识符;但对于更新文档中的每个不同标识符 (
$[identifier]
),您必须准确指定一个对应的数组筛选器文档。也就是说,不能为同一个标识符指定多个数组筛选器文档。例如,如果更新语句包含标识符x
(可能多次),则不能为arrayFilters
指定以下内容,其中包括x
的 2 个单独的筛选器文档:// INVALID [ { "x.a": { $gt: 85 } }, { "x.b": { $gt: 80 } } ] 但是,您可以在单个过滤器文档中的同一标识符上指定复合条件,例如以下示例:
// Example 1 [ { $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] } ] // Example 2 [ { $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] } ] // Example 3 [ { "x.a": { $gt: 85 }, "x.b": { $gt: 80 } } ] 附加到
Bulk.find()
方法,为updateOne()
和update()
操作指定数组筛选器。
例子
var bulk = db.coll.initializeUnorderedBulkOp(); bulk.find({}).arrayFilters( [ { "elem.grade": { $gt: 85 } } ] ).updateOne( { $set: { "grades.$[elem].mean" : 70 } } ); bulk.execute();