当前位置: 首页 > 知识库问答 >
问题:

如何用mongoose更新MongoDB文档

巫马俊力
2023-03-14

我有一个mongodb集合的mongoose模式,我将其定义如下:

var userSchema =  new mongoose.Schema({
  username: {type: String, unique : true},
  password: {type: String},
  firstname: String,
  lastname: String,
  sketches: [{name: String, sketch: Array}]
});

var User = mongoose.model('User', userSchema);

在数据库集合中,我当前有一个文档,它包含除sketches以外的所有属性的值,用于测试目的。我有一个服务器endpoint,当被调用时,它应该发出一个PUT请求来更新文档并向sketches数组中添加一个对象:

app.route("/addSketch/:username").put(function(req, res) {
  var user_name = req.params.username;
  User.findOne({username:user_name},function(err,foundObject){
    if(err){
      console.log("error");
      res.status(500).send();
    }
    else{
      if(!foundObject){
        res.status(404).send();
      }
      else{

        if(req.body.strokes && req.body.sketchName){
          var sketchObj = [];
          sketchObj[req.body.sketchName] = req.body.strokes;
          foundObject.sketches.push(req.body.sketchData);
        }
        foundObject.save(function(err,updatedObject){
          if(err){
            console.log(err);
            res.status(500).send();
          }
          else{
            res.send(updatedObject);
          }
        });
      }
    }

  });


  console.log('saving on server');
   var form = formidable.IncomingForm();

   console.log(form);
   console.log('the type of the request received is', (typeof req));

  form.parse(req, function(err, fields, files) {
      res.writeHead(200, {"content-type": "text/plain"});
      res.write('received upload:\n\n');
    var name = fields.name;
    var newSketch = new SavedSketch();
      newSketch.name = name;
      newSketch.sketchData =  fields.value;
      newSketch.save(function(err,savedObject){
        if(err){
               console.log(err);
               res.status(500).json({status:'failure'})
            }
            else{
              console.log("ID: " + fields.value.id + " strokeData:" + fields.value.strokes);
               res.json({status: 'success'});
            } 
      });

         res.end();
  });
  });

在这个web服务中,我基本上试图通过用户名选择用户文档,用户名作为参数传递给url字符串,如下所示:

http://localhost:11235/addSketch:testname

由于某种原因,当我尝试使用具有以下主体的postman发出PUT请求时,我得到一个404错误:

{"sketchName" : "tempName", "strokes":[1,2,3,4,5]}

文档本身包含以下数据:

{
    "lastname" : "name",
    "firstname" : "test",
    "password" : "password123",
    "username" : "testname",
    "_id" : ObjectId("57c4d7693aa85cea2acf4d4d"),
    "sketches" : [],
    "__v" : 0
}

web服务本身的逻辑中是否存在阻止找到文档的错误?

共有1个答案

何兴学
2023-03-14

404是错误找不到,表示路由不可用。

将url更改为:

http://localhost:11235/addSketch/testname

在此之后,您将不会得到404错误。希望这能帮上忙。

编辑:解决500错误问题

您正在草图数组中以错误的格式推送对象。

替换:

var sketchObj = [];
sketchObj[req.body.sketchName] = req.body.strokes;
foundObject.sketches.push(req.body.sketchData);

与:

foundObject.sketches.push({"name" : req.body.sketchName,"sketch" :req.body.strokes});

这应该可以解决您的500错误。

 类似资料:
  • 我正在尝试更新MongoDB中嵌套对象中的一个键值。目前,我的做法是覆盖整个嵌套对象,我如何改变一个键-值对?

  • 互联网上充斥着处理数组的资源,但对象通常更适合数据,而且似乎更高效。 我想在动态字段名下存储键值对象,如下所示: 这样做似乎比保留一个包含所有语言的数组并对其进行过滤以获取给定语言的所有语言条目更有效。 我的问题是:如何使用猫鼬将键值对插入到具有动态名称的对象中?对象是否需要存在,或者如果在一个操作中不存在,我可以创建它吗? 我试过这个: 但不管我是否有一个空对象开始,都没有运气:。 奖励:我应该

  • 问题内容: 也许是时候了,也许是我淹没在稀疏的文档中,无法将自己的头围在Mongoose中的更新概念上:) 这是交易: 我有一个联系模式和模型(缩短的属性): 我从客户端收到一个包含我需要的字段的请求,并因此使用我的模型: 现在我们解决了这个问题: 如果我打电话,如果使用相同电话号码的联系人已经存在(如预期-唯一),我将收到一条错误消息 我无法致电联系,因为该方法在文档中不存在 如果我对模型调用u

  • 主要内容:update() 方法,save() 方法在 MongoDB 中,可以使用 update() 和 save() 方法来更新集合中的文档。其中 update() 方法可以更新现有文档中的值,而 save() 方法则可以使用传入文档来替换已有文档。 update() 方法 update() 方法用于更新现有文档中的值,其语法格式如下: db.collection_name.update(     <query>,     <update>,

  • 问题内容: 我正在使用MongoDB数据库,该数据库的收集模型包括 班级 , 学生 , 学科 和[学术] 表现 。以下是基于猫鼬的架构和模型: 该集合的文件是最复杂的地段; 示例文档为: 我能够使用以下代码检索现有的班级文档并将其添加到分数中: 但是,如何添加/更新/删除该特定学生的成绩?我需要能够通过以下方式与集合进行交互: 检索所有学生或特定学生的分数(检索数组中的特定元素) 为特定主题添加/

  • 我想在这里完成的事情很简单。我正在尝试更新MongoDB集合中的单个文档。当我使用任何字段(如“name”)查找文档时,更新查询成功。以下是查询: 如果我试图用ObjectId查找文档,它永远不会工作,因为它与任何文档都不匹配。 是否有可能使此查询与对象ID一起工作? 我同意我的问题有点类似于如何使用Java mongodb驱动程序中的“_id”字段查询文档?但是,我在尝试更新文档时没有收到任何错