搜索一个文档并更新子文档的一些字段

Mongoose - search a document and update some fields of a subdocument

本文关键字:文档 字段 更新 一个 搜索      更新时间:2023-09-26

我对Mongoose很陌生,我试图熟悉它,但糟糕的文档没有帮助(没有搜索,没有函数列表,…)。

我有一个代表公司的文档和代表用户的子文档:

{
    "_id": "57ffa47f5b70f90831212348",
    "name": "mycompany",
    "address": "...",
    "phone": "...",
    "users": [
        {
            "_id": "57ffa47f5b70f90831212347",
            "username": "alpha",
            "name": "myname",
            "surname": "mysurname",
            "password": "..."
        }
    ]
}

我想找到一个特定的子文档和更新只是一些字段(姓名,姓氏,密码,…),从前端传递。

我收到包含已编辑字段(即req.body.name)的req.body和包含已登录用户的req.user:

"company_shortname": "CMPNY",
    "company_id": "57ffa47f5b70f90831212348",
    "user": {
        "id_access_level": 0,
        "surname": "ltd",
        "name": "mycompany",
        "username": "mycompanyusername",
        "_id": "57ffa47f5b70f90831212347",
        "password": "..."
    }
}

我想获得的是找到编辑的子文档(包含此子文档的公司将始终与登录的用户相同),更新传递的数据,并保存。

用这个答案,我试了:

Company.find({'_id': req.user.company_id}).select('name').exec(
        function(err, company) {
          if (err) res.status(500).send(err);
          var partialUpdate = req.body;
          var set = {};
          for (var field in partialUpdate) {
          set['users.$.' + field] = partialUpdate[field];
          }
          company.update({_id: req.user._id, "users._id": req.body._id},
          {$set: set},
          function(err, numAffected) {
            console.log('Number of users edited: ' +JSON.stringify(numAffected,null,4));
          });
      });

但是我不能让它工作…什么好主意吗?

我用这个查询解决了:

//saving in 'set' the fields to be edited
var partialUpdate = req.body;
    var set = {};
    for (var field in partialUpdate) {
    set['users.$.' + field] = partialUpdate[field];
    }
    //find the company,then the subdoc, then set the fields with 'set'
    Company.findOneAndUpdate({
      '_id': req.user.company_id, "users._id" : req.body._id},
      {$set: set},
      function(err, company) {
        //the company status after the update
        console.log('company updated: ' +JSON.stringify(company,null,4));
      });