2017-04-15 2 views
0

Ich bin neu zu Mongo und ich bin auf der Suche nach einer Hilfe.Mongo Database Update

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" } ] } 

Wenn ich will nur ein Eintrag in der Datenbank

{ "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” } 

Was ist die beste Option ändern?

Ich habe versucht, mit Update und findModify, aber es wird alle Einträge nach Schwellenwerte, wie diese Aktualisierung:

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

Sie möchten nur eine ändern, aber basierend auf was? –

Antwort

0

Führt eine Aktualisierung des ausgewählten Dokuments. Das Aktualisierungsfeld verwendet dieselbe Aktualisierung Operatoren oder Feld: Wertspezifikationen, um das ausgewählte Dokument zu ändern.

Die update() - Methode ändert entweder bestimmte Felder in vorhandenen Dokumenten oder ersetzt ein vorhandenes Dokument vollständig.

Sie verwenden die Update-Variante, die das Dokument komplett ersetzt.

Was Sie brauchen, ist Update-Variante, die Update-Operator verwendet, um Felder selektiv zu aktualisieren.

So etwas wie

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 })

Hinweis: $set ist ein Update Operator, die hostname und thresholds.$ aktualisiert, die aktualisieren die ausgewählte Array von Abfragewert unter Verwendung von Positions Operator zu aktualisieren.

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

Wenn ich richtig verstehe, wollen Sie nur noch ein Dokument aktualisieren, wenn Ihre Abfrage ein oder mehrere Ergebnisse liefert. Du kannst es versuchen. Verwenden Sie eine findOne-Abfrage, um eine _id zurückzugeben, die eindeutig ist. Verwenden Sie dann diese _id im Aktualisierungsfeld. Hier ist es in einem Vorgang.

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}) 
Verwandte Themen