Mongodb Mongo数据库更新

Mongodb Mongo数据库更新,mongodb,mongodb-query,Mongodb,Mongodb Query,我是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"

我是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” }
最好的选择是什么

我尝试了update和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 >
执行更新 所选文档的名称。更新字段采用相同的更新 运算符或字段:用于修改所选字段的值规范 文件

update()方法修改现有文件中的特定字段 记录或完全替换现有文档

您正在使用完全替换文档的更新变量

您需要的是更新变量,它使用更新操作符有选择地更新字段

差不多

db.servmon.findAndModify({query:{“hostName”:“server-prf-004”,“thresholds”:{“warn”:“None”,“crit”:“None”,“contact_mail”:“None”,“type”:“mu_check”,“contact_page”:“None”}},更新:{$set:{“hostName”:“server-prf-002”,“thresholds.$:{“warn”:“80”,“crit”:“90”,“contact_mail”:“None”,“type”:“mu u check”,“联系人页面”:“无”}},向上插入:true})

注意:
$set
是一个更新运算符,用于更新
主机名和
阈值。$
使用位置运算符将所选数组从查询更新为更新值


如果我理解正确,即使查询产生一个或多个结果,您也只想更新一个文档。您可以尝试这样做。使用findOne查询返回一个唯一的_id。然后在更新字段中使用该_id。这是一个操作

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

你只想改变一个,但基于什么?