2017-10-24 14 views
0

NodeJSおよびMongoDBサポートでハッシュタグ機能を実装したいので、用途を数えることもできます。ユーザーがページにハッシュタグを追加するたびに、データベース内でハッシュタグをプッシュまたは更新する必要があります。各hastagは次のようになります。MongoDBに複数のドキュメントを挿入または更新する

{_id:<auto>, name:'hashtag_name', uses: 0} 

私が直面してる問題は、ユーザーが同様に新しいタグを追加できるということですので、彼は、「完了」をクリックするとき、私は既存の「用途」欄をインクリメントする必要がありますタグを追加し、新しいタグを追加します。トリックは、1つのMongo命令でこれを行う方法です。これまでのところ、私はこれを達成するための2つの可能な方法を考えたが、私はどちらかと特に満足していない:

オプション1

私は、ユーザーが開始する前に、DBから既存のタグをフェッチサービスを持っています新しい記事を書く。これに基づき、私は新しいであるタグを検出し、2つのクエリを実行することができます:新しいタグを追加するものを、そして既存の1つの

オプション2

を更新している別の私は、リストをお送りします私は、すべてのタグに対してfind()を実行します。私が見つけたら、私は更新し、そうでなければ、私はそれを作成します。

オプション(今のところ解決策なしで)3

最良のオプションは、タグ名の配列を受け取り、クエリを実行し、既存の$ INC操作を行うと、不足しているものを追加することです。

質問

は、よりよい解決策はありますか?オプション3から最終結果を達成することはできますか?

+0

3.xでは、MongoDBのあなたの現在のバージョンは何ですか? – msoliman

+0

はい、3.x.申し訳ありませんが、申し訳ありません –

答えて

1

あなたはこの、それらのすべてが一括して実行されますような何かを行う必要があり、これはそれを行う方法のみスニペットのアイデアです:

var db = new Db('DBName', new Server('localhost', 27017)); 
    // Establish connection to db 
    db.open(function(err, db) { 
    // Get the collection 
    var col = db.collection('myCollection'); 

    var batch = col.initializeUnorderedBulkOp(); 

    for (var tag in hashTagList){ 
     // Add all tags to be executed (inserted or updated) 
     batch.find({_id:tag.id}).upsert().updateOne({$inc: {uses:1}}); 
    } 

    batch.execute(function(err, result) { 
     db.close(); 
    }); 
    }); 
+0

はコンソールから動作するようですが、今はトラブルがモンゴスキンからはうまくいきません。とにかく、元の質問への答えです。 –

0

バージョン2.6以降でMongodbが提供するBulk methodを使用します。同様に、タグが新しいときに挿入操作を実行し、すでに存在するときにカウンタを更新することができます。

+0

"リクエストしたURLは存在しないか、削除されました。" バルクの例を見ましたが、現在の状況にどのように適応させるかはわかりません。これはプログラマチックに起こります。コンソールからする必要はありません。 –

+0

あなたの言うことは正しいです、URLが間違っていた、私はそれを修正しました。とにかく、msolimanの答えは正しいと完全です。よろしくです。 よろしくお願いします。 –

関連する問題