【问题标题】:return pushed object's id nodejs mongoose返回推送对象的 id nodejs mongoose
【发布时间】:2020-07-26 19:06:10
【问题描述】:

我在文档(产品)中有对象数组(批次)。
将新对象推送到该数组后,我只想在 axios 发布响应中返回新添加的对象的自动生成 ID。请问怎么做?

batchRoutes.route('/add/:id').post(function(req,res){
    Product.findOneAndUpdate(
        {"_id":req.params.id},
        {$push:{"batches":req.body}},

        function(err,batch){
            if(err){
                return res.json({'status':false});
            }
            else{
              return res.json({'status':true});
            }

        });
});

架构

let Product= new Schema({
    productName:{
        type:String
    },
    batches:[{    
            batchNo:{
                type:String
            },
            expDate:{
                type:Date
            },

    }]
},

【问题讨论】:

    标签: javascript node.js reactjs mongoose


    【解决方案1】:

    您可以使用{new: true}选项访问更新后的文档,文档批次数组中的最后一个id就是新生成的id。

    所以变化是:

    1-) 添加{ new: true } 选项作为第三个参数

    2-) 获取最后生成的id:const batchId = doc.batches[doc.batches.length - 1]._id;

    batchRoutes.route("/add/:id").post(function (req, res) {
      Product.findOneAndUpdate(
        { _id: req.params.id },
        { $push: { batches: req.body } },
        { new: true },
        function (err, doc) {
          if (err) {
            return res.json({ status: false });
          } else {
            if (doc) {
              const batchId = doc.batches[doc.batches.length - 1]._id;
              return res.json({ status: true, batchId });
            } else {
              return res.status(404).json({ status: false });
            }
          }
        }
      );
    });
    

    【讨论】:

    • 这并不总是正确的,因为操作不是原子的。如果在const batchId = doc.batches[doc.batches.length - 1]._id; 之前有多个并行插入,那么这不会给出预期的结果
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多