Mongodb Meteor:反应式本地收集(仅限客户端)正确的观测值更改
我有一个包含多个数组的集合,即Mongodb Meteor:反应式本地收集(仅限客户端)正确的观测值更改,mongodb,meteor,cursor,Mongodb,Meteor,Cursor,我有一个包含多个数组的集合,即 memos: [...] todos: [...] 我将数组中的每个文档插入客户端上的本地集合: if (Meteor.isClient) { this.Memos = new Mongo.Collection(null); var results; results = Projects.findOne({ _id: currentProject_id }); results.memos.forEach(function(me
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'
我不想重新插入文档,只想反映更改
我已尝试修改退货备忘。将(备忘)
插入到:
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
}
});
但是,这会引发相同的错误。
更新上述操作非常有效,错误来自其他原因。见下面我的答案
我如何观察这些文档上的更改并只更新已更改的字段?
我想我需要像下面这样的东西:
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
});
}
});
meteor尝试将更改的文档重新插入本地
收藏
这是正常的,因为您要插入到集合中,这里需要的是对实际文档的更新,请为此使用运算符
return Memos.update({_id:memo._id},{$set:{memo:memo}});
查看有关更新运算符的更多信息解决方案:
insert
更改为upsert
,以防止meteor尝试插入具有相同\u id的新文档
谢谢@Ethaan,这让我更接近了。由于服务器通过默认的
added
/changed
/removed
观察回调自动执行插入操作,(我想)我需要编写自己的observeChanges
回调,将insert
行为更改为update
或upsert
。我对这个问题补充了一些细节。
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
}
});
});