"Unrecognized logical operator: $in" Mongo.collection 更新

"Unrecognized logical operator: $in" Mongo.collection update

我收到这个错误:

"Unrecognized logical operator: $in"

使用此查询时:

this.update(
            {}, {
                $pull: {
                    words: {
                        $in:['string', 'string1']
                    }
                }
            }, {
                multi: true
            });

我在客户端中扩展 Mongo.Collection 的 es6 class 中调用,到目前为止所有其他内容(插入、删除)都有效,我没有修改任何更新方法方法。该集合是这样声明的 local collection

WordsList = new WordCollection('words', {connection: null});)

该查询与文档 here 中的示例非常相似,实际上,我在尝试在控制台上重新创建此示例时也可以重现相同的错误。

I'm using Meteor 1.4.4.1 with MongoDB 3.2.12

出于某种原因我还不能确定,我可以将错误追溯到 Mongo 编译查询将其映射到逻辑运算符 ($and, $or) 而不是元素(比较查询)运算符($in, $eq)

可以修改本地集合中的多个值,但是可以使用的选择器或修饰符是有限制的,因为客户端集合用户 MiniMongo,它实现了 MongoDB 功能。

这种特殊情况是 MiniMongo 的缺点,其中在 $pull 表达式中使用了逻辑 Matcher,如 $pull 实现中的注释所示:

    // XXX Minimongo.Matcher isn't up for the job, because we need
    // to permit stuff like {$pull: {a: {$gt: 4}}}.. something
    // like {$gt: 4} is not normally a complete selector.
    // same issue as $elemMatch possibly?

(source: Meteor source code)

这是从 2013 年开始的,所以如果没有 PR 改变它的希望不大。

具体来说,匹配器只允许您使用逻辑选择器:"$and", "$or", "$nor", "$where", "$comment"。这就是为什么你不能使用 $in,它在 ELEMENT_OPERATORS.

中实现

作为解决方法(并且因为这只是客户端),您可以使用:

valueArray.forEach(val => WordsList.update({}, {$pull: {words: val}}, {multi: true}));