我是Mongo的新手,在敲击键盘3天之后已经接近我想去的地方,但现在我想我可能只是误解了某些关键概念:
我想做什么:
我有一个节点脚本,它经常从各种来源中提取Feed项并存储它们(标题,链接,来源,已处理:false)
我有另一个脚本随机抽出记录,一次一个,使用它们,并更新处理:true
结束目标:项目应该按标题唯一 - 如果之前已经看到它不应该写入数据库,并且一旦它被处理了一次,就不应该再次处理它。
INSERT SCRIPT:
key = {'title':title};
data = {'origin':origin, 'title':title, 'original_link':original_url, 'processed':false};
collection.update(key, data, {upsert:true}, function(err, doc) { ...
阅读脚本:
collection.findOne({processed:false}, function(err, doc){
if (err) throw err;
logger.info("Read out the following item from mongodb:...");
console.dir(doc);
thisId = doc._id;
markProcessed(thisId);
}
var markProcessed = function(id) {
collection.update({ _id:id },
{
$set: {'processed':true},
}, function(err, doc){
if (err) throw err;
logger.info("Marked record:"+id+" as processed");
console.dir(doc);
}
)
};
我尝试过使用collection.ensureIndex({'title':1},{unique:true})也没有成功。
当两个脚本并行运行时,读取脚本最终会重复处理已经处理过的记录,尽管markProcessed函数昨天全部正常运行但它今天奇迹般地没有:)
我非常感谢任何指导。
答案 0 :(得分:0)
您的插入脚本存在问题。当您使用collection.update
并且数据库中已有一个具有相同密钥的文档时,该文档将被新文档覆盖。唯一索引不会阻止这种情况,因为同时集合中没有两个具有相同标题的文档。
如果您不想覆盖现有记录,请使用collection.insert
,当插入的文档违反唯一索引时,{{3}}会失败。