2017-12-28 16 views
1

私はStitch platform by MongoDBを使用しています。私はvaluecountをその値に関連付けてデータベースに保存します。今度はvalueが初めて存在しない可能性がありますので、valuecount = 1として挿入します。 update()を使用して、既存のカウント値を$incで更新したり、upsert()を使用してデータベースに値を追加したりすることができます。 今、問題は、私の値とカウントのmapがあり、私は一度に(更新/ upsert)を挿入したいと思います。私はネットワークに負荷をかけたくありません。 mapを一度に挿入するのにinsertMany()を使用していましたが、明らかに値が更新されません。MongoDBの既存の値を増やす方法

これは可能ですか?

P.S.私は同じもののためにJavaScriptを使用しています。 MongoDBの3.6による

答えて

1

db.collection.update(query, update, options)

は、既存のドキュメントまたはコレクション内のドキュメントを変更します。このメソッドは、更新パラメータに応じて、既存のドキュメントまたはドキュメントの特定のフィールドを変更するか、既存のドキュメントを完全に置き換えることができます。

意味は、更新を使用して複数のドキュメントをアップセルできるということです。

まず、マップから値だけを含む配列を作成する必要があります。

const arrayOfValues = ['value_01', 'values_02']; 

は、その後、更新方法にアップサート+マルチオプションを使用する必要があります。

db.foo.update({value: { $in: arrayOfValues}}, {$inc: {count:1}}, { upsert: true, multi: true }); 

テスト出力:

> db.createCollection("test"); 
{ "ok" : 1 } 
> db.test.insertMany([{value: "a"}, {value: "b"}, {value: "c"}]; 
...); 
2017-12-31T12:12:18.040+0200 E QUERY [thread1] SyntaxError: missing) after argument list @(shell):1:61 
> db.test.insertMany([{value: "a"}, {value: "b"}, {value: "c"}]); 
{ 
    "acknowledged" : true, 
    "insertedIds" : [ 
     ObjectId("5a48b8061b98cc5ac252e435"), 
     ObjectId("5a48b8061b98cc5ac252e436"), 
     ObjectId("5a48b8061b98cc5ac252e437") 
    ] 
} 
> db.test.find(); 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e435"), "value" : "a" } 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e436"), "value" : "b" } 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e437"), "value" : "c" } 
> db.test.update({value: { $in: ["a", "b", "c"]}}, {$inc: {count:1}}, { upsert: true, multi: true }); 
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 }) 
> db.test.find(); 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e435"), "value" : "a", "count" : 1 } 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e436"), "value" : "b", "count" : 1 } 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e437"), "value" : "c", "count" : 1 } 
> db.test.update({value: { $in: ["a", "b", "c"]}}, {$inc: {count:1}}, { upsert: true, multi: true }); 
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 }) 
> db.test.find(); 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e435"), "value" : "a", "count" : 2 } 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e436"), "value" : "b", "count" : 2 } 
{ "_id" : ObjectId("5a48b8061b98cc5ac252e437"), "value" : "c", "count" : 2 } 
> db.test.update({value: { $in: ["a", "b", "c"]}}, {$inc: {count:1}}, { upsert: true, multi: true }); 
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 }) 

は、私は、それが

+0

実際:)役立ちましたホープ私はjavascriptでそれを行う方法を知ることができればそれは素晴らしかったので、javascriptで動作していた。しかし、それは大丈夫です、少なくとも今どこから始めるべきか分かります。 –

+0

あなたはあなたの答えの源を教えてください。本当に役立つでしょうか。 –

+0

@Yochai_Akokaこのコマンドを実行しようとしました。db.test.update({value:{$ in:["b"、 "a"]}}、{$ inc:{count:1}}、{upsert:true 、multi:true}) 'しかし、データベースには何もアップしません。私のdbには既に '' value: ''が 'count:1'であったので、' 'value:" b "'を 'count:1'にアップし、' value: "aのカウントを増やしたいと思っていました。すでにdbに存在する値の数が増えます。 –

関連する問題