返回推送对象的 id nodejs mongoose

Posted

技术标签:

【中文标题】返回推送对象的 id nodejs mongoose【英文标题】:return pushed object's 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
            ,

    ]
,

【问题讨论】:

【参考方案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; 之前有多个并行插入,那么这不会给出预期的结果

以上是关于返回推送对象的 id nodejs mongoose的主要内容,如果未能解决你的问题,请参考以下文章

无法得到我在 nodejs / mongoose / bluebird 中返回的承诺

Mongoose/Nodejs - 填充函数仅返回用户的对象 ID

如何在nodejs中将猫鼬模型数据作为数组返回[重复]

NodeJS 与 MySQL - 返回空白数组

嵌套的 JSON 对象在 NodeJS 中返回 [Object] [重复]

NodeJS 和 MongoDB - 根据 id 数组获取对象