【问题标题】:"Unrecognized logical operator: $in" Mongo.collection update“无法识别的逻辑运算符:$in” Mongo.collection 更新
【发布时间】:2017-06-18 15:32:00
【问题描述】:

我收到此错误:

“无法识别的逻辑运算符:$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

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

【问题讨论】:

  • 我认为没有特定文档 _id 的流星不允许这种更新。此外,在浏览器客户端中的 Minimongo 中可能无法正常工作,但这是“服务器端”的有效语法。所以也许你应该使用服务器方法。
  • 好吧,文档中的示例没有传递 id,它适用于所有匹配的文档。另外(忘了提)这是一个客户端集合(传递 {connection: null} 作为第二个参数),将在帖子中更新它。
  • 我认为您在这里混淆了文档来源。 MongoDB 核心文档列出了 $pull 的正确语法选项,这是一个有效的语句。 Meteor .update() 在不包含特定文档 _id 时认为“不受信任的”客户端代码无效。除非您特别保护该方法,否则将不允许这样做。我认为您确实需要以Server method 的身份执行此操作
  • 我还特意删除了 MongoDB 标签,因为这种情况下的语法实际上是 Meteor 特定的。作为对 MongoDB 的单独查询,它是完全有效的。
  • 所以这是一个local collection,它只存在于客户端,所以从服务器调用它在这种情况下实际上不起作用:(插入和删除方法也不起作用如果这实际上是服务器中的一个集合,则出于您提到的安全原因而工作

标签: javascript meteor minimongo


【解决方案1】:

可以在本地集合中修改多个值,但是可以使用的选择器或修饰符存在限制,因为客户端集合使用 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 源码)

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

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

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

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

【讨论】:

  • 谢谢你!不幸的是,我还没有足够的声誉来投票给你,但你阐明了罪魁祸首并提供了一个可行的解决方案。
  • 继续提出好问题,你很快就会:)无论如何,如果这个答案解决了问题,你可以接受这个答案。
  • 看起来我已经很接近了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多