首页 > 解决方案 > 通过对象 ID 定位时无法更新字段,json 解析错误

问题描述

我有一个包含内容的集合:

db.simplecollection2.find()
{ "_id" : ObjectId("5c312200508c979b46d21866"), "artistname" : "The 
Tea Party" }

当我在 mongo shell 中使用以下内容更改艺术家名称时,它可以工作

db.simplecollection2.update(
{"_id":ObjectId("5c312200508c979b46d21866")},{"artistname":"new"})

但是在javascript中我得到一个错误:SyntaxError:JSON.parse()的位置7处的JSON中的意外令牌O,虽然我将字符串解析为对象而不是对象到对象..这是为什么?

MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var dbo = db.db("simpledb");
      var myquery = JSON.parse("{\"_id\":ObjectId(\"5c31184bdb14729aa4806882\")}");
      var newvalues = { $set: {"artistname":"cool"} };
      dbo.collection("simplecollection2").updateOne(myquery, newvalues, function(err, res) {
        if (err) throw err;
        console.log("1 document updated");
        db.close();
      });

标签: javascriptmongodb

解决方案


调用 JSON.parse 的行失败,因为参数不是 JSON。如果你这样做JSON.stringify({"_id":ObjectId("5c312200508c979b46d21866")}),你会发现它也不能把它变成一个字符串。原因是 JSON 可以包含字符串、布尔值、数字和数组。ObjectId("5c312200508c979b46d21866")不能解析浏览器知道的东西,即使它在 shell 中是有意义的。但是,我认为如果您将它作为字符串传递,它应该可以作为数据库的查询。

MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var dbo = db.db("simpledb");
      var myqueryObj = {
          _id: 'ObjectId("5c312200508c979b46d21866")'
      };
      var myquery = JSON.parse(JSON.stringify(myqueryObj));
      var newvalues = { $set: {"artistname":"cool"} };
      dbo.collection("simplecollection2").updateOne(myquery, newvalues, function(err, res) {
        if (err) throw err;
        console.log("1 document updated");
        db.close();
      });

推荐阅读