0

私は 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 関数は、昨日はずっと機能していましたが、奇跡的に今日は機能していません :)

ご指導いただければ幸いです。

4

1 に答える 1

0

挿入スクリプトに問題があります。を使用collection.updateしていて、データベースに同じキーを持つドキュメントが既にある場合、そのドキュメントは新しいドキュメントで上書きされます。コレクション内に同じタイトルの 2 つのドキュメントが同時に存在することはないため、一意のインデックスはこれを防ぎません。

既存のレコードを上書きしたくないcollection.insert場合は、挿入されたドキュメントが一意のインデックスに違反している場合に which を使用すると失敗します。

于 2013-08-24T18:45:40.633 に答える