【问题标题】:Mongoose - search a document and update some fields of a subdocumentMongoose - 搜索文档并更新子文档的某些字段
【发布时间】:2017-03-07 07:50:21
【问题描述】:

我对 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": "..."
    }
}

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

使用这个answer,我试过了:

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));
          });
      });

但我无法让它工作..有什么想法吗?

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

    我用这个查询解决了:

    //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));
          });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      相关资源
      最近更新 更多