如何知道Mongoose'的追加销售创建了一个新文档

How to know if Mongoose's upsert created a new document?

本文关键字:一个 文档 新文档 创建 Mongoose 何知道 追加      更新时间:2023-09-26

我在node.js/express.js:中有这段代码

var User = mongoose.model('User');
var usersRouter = express.Router();
usersRouter.put('/:id', function(req, res) {
    req.body._id = req.params.id;
    var usr = new User(req.body);
    usr.validate(function (err) {
        if (err) {
            res.status(400).json({});
            return;
        }
        var upsertData = usr.toObject();
        delete upsertData._id;
        User.update({_id: usr._id}, upsertData, {upsert: true}, function(err) {
            if (err) {
                res.status(500).json({});
                return;
            }
            res.status(204).json({});
        });
    });
});

它工作正常,但如果已经创建了一个新文档(状态201,响应体中有json)或更新了一个现有文档(状态204),我想向客户端发送一个不同的响应。

有没有办法区别于User.update的回调?

使用回调函数中的第三个参数:

...
User.update({_id: usr._id}, upsertData, {upsert: true}, function(err, num, n) {
  if (err) {
     res.status(500).json({});
     return;
   }
   if (!n.updatedExisting) { 
       /* new document */
   }
   res.status(204).json({});
});
...

n是这样一个对象:

{ updatedExisting: false,
  upserted: <ObjectId>,
  n: 1,
  connectionId: 11,
  err: null,
  ok: 1 }

当文档被更新时,updatedExisting属性为true,因此它是以前创建的。如果是false,则表示新文档是在该调用期间创建的。