MongoDB中的$ set:未按预期工作

时间:2018-03-22 04:12:45

标签: node.js mongodb api mlab

我的数据库中有以下文档:

{
....
"key": "val1",
....
"array" :[
{
"k":"v1",
"rejected":"0"

},
{
"k":"v2",
"rejected":"0"

}

]
.....
}

现在基本上我想设置“被拒绝”:“1”代表(“key”:“val1”&amp;&amp; array [i]。“k”:“v1”)。< / EM>

我写的API调用是:

var val1="val1";
var v1="v1";

    request.put('https://api.mlab.com/api/1/databases/DB/collections/doc?q={"key": "'+val1+'","array.k":"'+v1+'"}&apiKey=.....',
                        { json: { "$set": {"rejected": "1"}
                        } },
                        function (error, response, body) {
                            if (!error && response.statusCode == 200) {
                                console.log("----->Insertion"+body);
                                return res.status(200).send("[{\"status\":\"success\"}]");
                            }
                            else
                            {console.log(JSON.stringify(response));}
                        });

但API不是编辑所需的字段,而是在文档的末尾附加一个新字段:

 {
    ....
    "key": "val1",
    ....
    "array" :[
    {
    "k":"v1",
    "rejected":"0"

    },
    {
    "k":"v2",
    "rejected":"0"

    }

    ]
    .....

    "rejected":"1"
    }

2 个答案:

答案 0 :(得分:1)

在这种情况下,请使用db.collection.update

Mongodb shell查询

If there is only one matching document

db.collection_name.update(
  {key:"val1", "array.k":"v1"},
  {$set:{"array.$.rejected":"1"}}      
);

If there are multiple documents matching the criteria then use the below query with multi:true

db.collection_name.update(
  {key:"val1", "array.k":"v1"},
  {$set:{"array.$.rejected":"1"}}, 
  {multi:true}
);

更新查询有三个部分

首先是我们必须提供的匹配部分

"key":"val1" and "array.k": "v1"

第二部分是设置更新值

使用$ set和position运算符,设置要更新的值 这里匹配array.k更新被拒绝为&#34; 1&#34;

最后一部分是指定多个文档是否与条件匹配,然后更新所有匹配的文档

答案 1 :(得分:0)

假设您的json对象被称为数组 ...读取mongodb中的位置运算符。然后这将更新您的数组元素

Object.update(
  {'array.key': val1},
  {$set: {'array.$. rejected': 1}},
  function(err, count) { ... });