0

我是 Mongo 的新手,在将头撞在键盘上 3 天后,我已经接近了我想要的位置,但现在我想我可能只是误解了某些关键概念:

我正在尝试做的事情:

我有一个节点脚本,它非常频繁地从各种来源中提取提要项目并存储它们(标题、链接、来源、已处理:false)

我有另一个脚本随机提取记录,一次一个,使用它们,并更新处理:true

最终目标:项目在标题上应该是唯一的——如果在它不应该被写入数据库之前被看到,并且一旦它被处理过一次,就永远不会再被处理。

插入脚本:

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 函数昨天一直在工作,但今天却奇迹般地没有:)

我将非常感谢任何指导。

4

1 回答 1

0

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

当您不想覆盖现有记录时,collection.insert当插入的文档违反唯一索引时,使用 which 将失败。

于 2013-08-24T18:45:40.633 回答