我有一个包含几个数组的集合,即
memos: [...]
todos: [...]我将每个文档从数组插入到客户机上的本地集合中:
if (Meteor.isClient) {
this.Memos = new Mongo.Collection(null);
var results;
results = Projects.findOne({
_id: currentProject_id
});
results.memos.forEach(function(memo) {
return Memos.insert(memo);
});
}如果我调用一个方法来更改服务器集合中的备注:
({
completeMemo: function(project_id, memo_id, ifCompleted) {
return Projects.update({
_id: project_id,
'memo._id': memo_id
}, {
$set: {
'memos.$.completed': ifCompleted
}
});
}
});Meteor尝试将更改后的文档重新插入本地集合,引发以下错误:
Exception from Tracker recompute function:
MinimongoError: Duplicate _id '43ttergerg33t3t'与其重新插入文档,我只希望反映changes。
我尝试过修改return Memos.insert(memo)以:
Memos.upsert({
_id: memo._id
}, {
$set: {
direction: memo.direction,
sender: memo.sender,
sender_id: memo.sender_id,
sentAt: memo.sentAt,
text: memo.text,
type: memo.type,
viewed: memo.viewed
}
});但是,这会引发相同的错误。UPDATE上面的工作原理很好,错误来自于其他方面。见下面的答案。
如何观察到这些文档上的更改,只需更新已更改的字段?
我想我需要这样的东西:
Memos = new Mongo.Collection;
query = Projects.findOne({
_id: currentProject_id
});
handle = query.memos.observeChanges({
added: function(id, doc) {
Memos.insert(doc);
},
changed: function(id, doc) {
..........???;
},
removed: function(id) {
Memos.remove({
_id: id
});
}
});发布于 2015-04-06 11:23:37
解决方案:
insert更改为upsert,以防止meteor尝试使用相同的_id插入新文档。results.memos.forEach(function(memo) {
return Memos.upsert({
_id: memo._id
}, {
$set: {
direction: memo.direction,
sender: memo.sender,
sender_id: memo.sender_id,
sentAt: memo.sentAt,
text: memo.text,
type: memo.type,
viewed: memo.viewed
}
});
});发布于 2015-04-06 00:09:51
meteor尝试将更改后的文档重新插入本地集合中。
这是正常的,因为您要插入集合,这里需要的是对实际文档的更新,为此使用$set操作符
return Memos.update({_id:memo._id},{$set:{memo:memo}});查看有关更新操作符这里的更多信息
https://stackoverflow.com/questions/29463308
复制相似问题