4

次のような文字列の配列を受け取るプロシージャを書いています

var mywords = ["cat", "dog", "fish"] 

そして、それらをMongoDbコレクション(「words」コレクションと呼ばれます)にアップサートします。各単語がコレクションに挿入された回数をカウントしたいと思います。一部の単語はすでにコレクションに含まれている可能性があり、一部は含まれていない可能性があります。

これは機能します:

var my_func = function(mywords) {
    //Get connection to db...

    mywords.forEach(function(word) {
        collection.update({name: word}, {$inc: {count: 1}}, {upsert: true});
    });
}

素晴らしい。したがって、{name:dog、count:3}がコレクション内の唯一のドキュメントであり、my_func(["cat"、 "dog"、 "fish"])を実行すると、コレクションには次のものが含まれるようになります。

{name: dog, count: 4, _id: blah}
{name: cat, count: 1, _id: blah}
{name: fish, count: 1, _id: blah}

これは、私がこれをすべて1つの更新で実行したいことを除いて、まさに私が望んでいることです。forEach内ではありません。私はこれを試しました:

var broken_func = function(mywords) {
    //Get connection to db...

    collection.update({name: {$in : {mywords}}, {$inc: {count: 1}}, {upsert: true, multi:true});
}

ただし、{name:dog、count:3}のみを含む同じコレクションから開始し、my_func(["cat"、 "dog"、 "fish"])を実行すると、コレクションは次のようになります。

{name: dog, count: 3}
{count: 1}

MongoDbで、ドキュメントのnameフィールドをmywords配列内の任意の文字列と一致させ、そのドキュメントのcountフィールドをインクリメントしたいと思います。mywordsにある文字列に等しいドキュメント名フィールドがない場合は、ドキュメント{name: "stringFrom_mywords"、count:1}を作成します。

私がやりたいことは可能ですか、そしてどうすれば私が望む行動を達成できますか?forEachを使用して個別に更新するのは非効率的だと思います。その情報が役立つと思われる場合は、node.jsMongoDbドライバーを使用しています。私の問題は、このルビーの質問に似ていることを認識しています。MongoDbで複数のレコードをアップサートする

4

1 に答える 1

1

アップサートフラグとマルチフラグの両方を使用して更新を実行することはできますが、希望する効果は得られません。forEachの例で行っているように、3つの個別のアップサートコマンドを実行する必要があります。

この機能をMongoDBの将来のリリースに追加したい場合は、SERVERプロジェクトでJiraチケットを開いてください。

于 2012-07-25T19:41:03.403 に答える