私は Mongo を初めて使用し、キーボードに頭をぶつけて 3 日間過ごした後、なりたい場所に近づいてきましたが、今では、特定の重要な概念を誤解しているだけかもしれません。
私がやろうとしていること:
さまざまなソースから非常に頻繁にフィード アイテムを取得して保存するノード スクリプトがあります (タイトル、リンク、オリジン、処理済み:false)。
私は別のスクリプトを使用して、一度に1つずつランダムにレコードを引き出し、処理されたものを更新しています:true
最終目標: アイテムはタイトルごとに一意である必要があります。以前に表示された場合は DB に書き込まれません。また、一度処理されると、再度処理されることはありません。
スクリプトを挿入:
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}) を使用してみましたが、どちらも成功しませんでした。
2 つのスクリプトが並行して実行されると、read スクリプトは、すでに処理されたレコードに対して作業を繰り返すことになります。markProcessed 関数は、昨日はずっと機能していましたが、奇跡的に今日は機能していません :)
ご指導いただければ幸いです。