客户端错误"错误:documentMatches需要一个文档"通过索引

时间:2015-09-29 18:50:08

标签: arrays mongodb meteor

当我从集合中的数组中删除元素时,我看到了错误。我按索引删除元素。

奇怪的是,服务器代码有效但在控制台中我看到了一个错误"异常,同时模拟了调用' / patterns / update'错误:documentMatches需要一个文档"。

我花了很多年时间试图弄清楚问题是什么,我很难过!请参阅下面的代码,了解重现问题的最小示例。

(我发现这个错误的唯一参考似乎并不相关 - 我认为这张海报是通过属性而不是索引来识别元素: Removing an object from an array inside a Collection。这篇文章似乎与Angular有关,我没有使用过,这个问题似乎没有得到回答:Minimongo errors when I try to update a document containing an array

为什么查询可能在客户端而不是服务器上失败的任何想法?当我用

从数组中拉出元素时,会发生错误
Patterns.update({_id: pattern_id}, {$pull : {"my_array" : null}});

完整代码:

HTML

<head>
  <title>Array test</title>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">

  <p>Values in the array: {{array}}</p>
  <button class="add">Add item to array</button>
  <button class="remove">Remove item from array</button>
</template>

JavaScript的:

Patterns = new Mongo.Collection('patterns');
if (Patterns.find().fetch().length == 0)
{
  Patterns.insert({name: "My document", my_array: [0] });
}

if (Meteor.isClient) {
  Template.hello.helpers({
    array: function () {
      return Patterns.find().fetch()[0].my_array;
    }
  });

  Template.hello.events({
    'click button.add': function () {
      pattern_id = Patterns.find().fetch()[0]._id;
      var new_value = Patterns.findOne(pattern_id).my_array.length;
      Patterns.update({_id: pattern_id}, {$push: {my_array: new_value}});
    },
    'click button.remove': function() {
      pattern_id = Patterns.find().fetch()[0]._id;
      var index = Patterns.findOne(pattern_id).my_array.length -1;
      var obj = {};
      obj["my_array." + index ] = "";
      Patterns.update({_id: pattern_id}, {$unset : obj});

      // THIS LINE CAUSES THE CONSOLE ERROR
      Patterns.update({_id: pattern_id}, {$pull : {"my_array" : null}});
    }

  });
}

1 个答案:

答案 0 :(得分:3)

您遇到Minimongo的当前限制,提到in the source here

    // 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?

但是,如果您在该异常后检查您的收藏,您将看到该项目已从您的阵列中删除。这可能发生在服务器端(使用真正的MongoDB,然后与客户端集合同步),因为此错误仅影响客户端集合上的客户端延迟补偿操作,然后在更新到达时更正服务器。

我的建议是,你遇到的最小限制是将你的更新转移到流媒体方法,你总是在服务器上交互mongodb,though you will need to add stub methods to handle any latency compensation you require on the client.