好吧,根据这个答案Meteor $upsert 标志仍在增强列表中,并且似乎在 1.0 版本之后添加到稳定分支中。
所以第一种方法是如何添加唯一索引:
这里列出了所有的实现方式。我建议您使用本机 mongo 索引,而不是代码实现。
MongoDB中没有事务,乐观并发的方式要复杂得多。
这是我的实现(小心,可能是错误的))):
var result_callback = function(_id) {
// callback to call on successfull insert made
}
var $set = {stage_id: xxxx, entrant_id: xxxx};
var created_at = Date.now().toFixed();
var $insert = _.extend({}, $set, {created_at: created_at});
Scores.insert($insert, function(error, _id) {
if (error) {
//handle it
return;
}
var entries = Scores.find($set, {sort: {created_at: -1}}).fetch()
if (entries.length > 1) {
var duplicates = entries.splice(0, entries.length - 1);
var duplicate_ids = _.map(duplicates, function(entry) {
return entry._id;
});
Scores.remove({_id: {$in: duplicate_ids}})
Scores.update(entries[0]._id, $set, function(error) {
if (error) {
// handle it
} else {
result_callback(entries[0]._id)
}
})
} else {
result_callback(_id);
}
});
希望这会给你一些好的想法)
抱歉,我之前的回答完全不正确。