Mongo - 新的与处理过的方法

时间:2013-08-24 18:13:35

标签: mongodb unique

我是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函数昨天全部正常运行但它今天奇迹般地没有:)

我非常感谢任何指导。

1 个答案:

答案 0 :(得分:0)

您的插入脚本存在问题。当您使用collection.update并且数据库中已有一个具有相同密钥的文档时,该文档将被新文档覆盖。唯一索引不会阻止这种情况,因为同时集合中没有两个具有相同标题的文档。

如果您不想覆盖现有记录,请使用collection.insert,当插入的文档违反唯一索引时,{{3}}会失败。