【问题标题】:$set in MongoDB : Not working as intended$set 在 MongoDB 中:未按预期工作
【发布时间】:2018-08-31 09:42:30
【问题描述】:

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

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

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

}

]
.....
}

现在基本上我想为 ("key":"val1" && array[i]."k":"v1" ) 设置 "rejected":"1" 。

我写的 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"
    }

【问题讨论】:

    标签: node.js mongodb api mlab


    【解决方案1】:

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

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

    【讨论】:

    • 请帮助我了解 API 结构
    • 您可以相应地更改代码,或者您可以将您的完整代码分享给我以便进一步调试
    • 这是完整的代码。第一个片段是我的文档在 DB 中的样子。然后我已经说明了我想要实现的目标。第二个片段是我为做这些事情而进行的 API 调用。就是这样。
    • 我没有得到你在那个请求调用中所做的 $set 部分?我认为那是错误的。您只是在调用 API 而不是任何 mongodb 函数...
    【解决方案2】:

    在这种情况下使用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 和位置运算符,设置要更新的值 这里匹配array.k更新被拒绝为“1”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多