2017-04-15 13 views
0

私はmongoを新しくしています。私は助けを求めています。Mongoデータベースアップデート

MongoDB Enterprise > db.servmon.find({ "hostName" : “server-prf-004”}) 
{ "_id" : ObjectId("58f0a4a2ff980d97cce0a79c"), "hostName" : “server-prf-004", "thresholds" : [ { "warn" : "None", "crit" : "None", "contact_mail" : "None", "type" : "loadcheck", "contact_page" : "None" }, { "warn" : "None", "crit" : "None", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" }, { "map" : "/ora,/arch", "crit" : "None", "warn" : "None", "contact_mail" : "None", "type" : "diskmon", "contact_page" : "None" } ] } 

私は

{ "warn" : "None", "crit" : "None", "contact_mail" : "None", "type" : "loadcheck", "contact_page" : "None” } to to { "warn" : “90", "crit" : “80", "contact_mail" : "None", "type" : "loadcheck", "contact_page" : "None” } 

データベースに一つだけのエントリを変更したい場合は最良のオプションは何ですか?

私が更新してfindModifyてみましたが、それはこのように、しきい値の後にすべてのエントリを更新している:

MongoDB Enterprise > db.servmon.findAndModify ({ query:{"hostName" : “server-prf-004","thresholds" : { "warn" : "None", "crit" : "None", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } }, update :{ "hostName" : "server-prf-002","thresholds" : { "warn" : "80", "crit" : "90", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } } ,upsert: true }) 

MongoDB Enterprise > db.servmon.find({ "hostName" : “server-prf-004"}) 
{ "_id" : ObjectId("58f0a4a2ff980d97cce0a799"), "hostName" : "server-prf-001", "thresholds" : { "warn" : "80", "crit" : "90", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } } 
MongoDB Enterprise > 
+0

1つだけ変更したいのですが、何に基づいていますか? –

答えて

0

は、選択した文書の更新 を実行します。更新フィールドは、同じ更新 演算子またはフィールド:値指定を使用して、選択した ドキュメントを変更します。

update()メソッドは、既存の ドキュメント内の特定のフィールドを変更するか、既存のドキュメントを完全に置き換えます。

文書を完全に置き換える更新版を使用しています。

更新演算子を使用してフィールドを選択的に更新する更新バリアントが必要です。

何か

db.servmon.findAndModify ({ query:{"hostName" : "server-prf-004", "thresholds" : { "warn" : "None", "crit" : "None", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } }, update :{ $set:{ "hostName" : "server-prf-002", "thresholds.$" : { "warn" : "80", "crit" : "90", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } } } ,upsert: true })

等注:$set位置演算子を使用して値を更新するクエリから選択されたアレイを更新hostnamethresholds.$を更新する更新演算子です。

https://docs.mongodb.com/manual/reference/command/findAndModify/#dbcmd.findAndModify

https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-parameter

https://docs.mongodb.com/manual/reference/operator/update/set/#up._S_set

https://docs.mongodb.com/manual/reference/operator/update/positional/

0

私は右理解していれば、あなたは自分のクエリは、1つまたは複数の結果を生成する場合でも、一つの文書を更新したいです。これを試すことができます。一意である_idを返すには、findOneクエリを使用します。次に、更新フィールドでその_idを使用します。ここでそれは1つの操作にあります。

db.update({_id: 
       db.servmon.findOne(
        { 
         "hostName" : “server-prf-004", 
         "thresholds" : { "warn" : "None", "crit" : "None", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } 
        })['_id'] 
      } 
      { 
       $set: 
        { 
         "hostName" : "server-prf-002","thresholds" : { "warn" : "80", "crit" : "90", "contact_mail" : "None", "type" : "mu_check", "contact_page" : "None" } 


        } 
      }, 
      {upsert:true})