次のような文字列の配列を受け取るプロシージャを書いています
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で複数のレコードをアップサートする