更新MongoDB中的多个字段的值

时间:2015-02-05 03:00:57

标签: mongodb

我是最近操纵MongoDB的新手,但我真的需要更新这些字段......

db_name: test   
table_name: info

{
    "_id" : ObjectId("54bf9ab4f8eda6747567b122"),
    "archives" : [
        {
            "evalution" : {
                "positive" : 0,
                "undefine" : 0,
                "negative" : 0
            },
            "source" : ObjectId("54cb6f455decd8037528756b")
        }
    ]
}

我想{strong}增加 positiveundefine 1,如果evalution 不存在

"evalution" : {
    "positive" : 0,
    "undefine" : 0,
    "negative" : 0
} 

应添加到对象中。

我不知道我是否表达清楚,但我真的需要一些帮助......

2 个答案:

答案 0 :(得分:2)

如果评估不存在,您可以使用以下查询创建子文档。

db.test.update(
 {_id:ObjectId("54bf9ab4f8eda6747567b122"),
 "archives.source" : ObjectId("54cb6f455decd8037528756b"),
 "archives.evalution":{$exists:false}},
 {$set:{"archives.$.evalution":{positive:1,negative:0,undefine:1}}}
)

注意:位置运算符最多只能达到一个级别,因此在知道archieves数组的索引之前,不能递增值。

你得到了archieves数组的索引并使用以下命令递增。在这种情况下 0 在哪里     source = ObjectId(“54cb6f455decd8037528756b”)

db.test.update(
 {_id:_id:ObjectId("54bf9ab4f8eda6747567b122")},
 {$inc:{"archives.0.evalution.positive":1}}
)

答案 1 :(得分:1)

了解更新的语义会有所帮助。为什么要递增这两个字段?为什么要递增两个字段,就像进行计数一样,但如果字段不存在,则要将默认值设置为0(而不是1)? “evaluation不存在”与值

之间是否存在语义差异
{
    "positive" : 0,
    "undefine" : 0,
    "negative" : 0
}

evaluation?或者“evaluation不存在”与

之间
{
    "positive" : -1,
    "undefine" : -1,
    "negative" : 0
}

值?对于这些默认值中的至少一个,似乎不是,因此您应该将evaluation设置为在插入文档或数组元素时具有适当的默认值。如果您这样做,您的更新很简单:

db.info.update(
    { 
        "_id" : ObjectId("54bf9ab4f8eda6747567b122"), 
        "archives.source" : ObjectId("54cb6f455decd8037528756b")
    },
    {
        "$inc" : { 
            "archives.$.evalution.positive" : 1,
            "archives.$.evalution.undefine" : 1,
        }
    }
)

另外,我认为你有一些错别字:

  1. evalution可能意味着evaluation或可能意味着evolution
  2. positivenegative的正确补充是undefined