当我从集合中的数组中删除元素时,我看到了错误。我按索引删除元素。
奇怪的是,服务器代码有效但在控制台中我看到了一个错误"异常,同时模拟了调用' / 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}});
}
});
}
答案 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.