“无法识别的逻辑运算符:$ in”Mongo.collection update

时间:2017-06-18 00:42:34

标签: javascript meteor minimongo

我收到了这个错误:

  

“无法识别的逻辑运算符:$ in”

使用此查询时:

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

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

  

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

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

  

我正在使用Meteor 1.4.4.1和MongoDB 3.2.12

由于某种原因,我还无法确定,我可以跟踪错误,编译将查询映射到逻辑运算符($和,$或)而不是元素(比较查询)运算符($ in,$ eq)的Mongo )

1 个答案:

答案 0 :(得分:1)

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

这个特例是MiniMongo的缺点,其中Matcher表达式中使用了逻辑$pull,如$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:流星源代码)

这是从2013年开始的,因此没有PR就没有太大希望改变。

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

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

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