我如何知道Mongoose addToSet何时实际添加了什么?

时间:2015-06-29 18:12:42

标签: node.js express mongoose

我有一个包含项目的数据库,每个项目都有一系列链接。添加链接时我的express.js代码是这样的:

router.get('/links/add', function(req, res){
    Project.findOneAndUpdate(
        {_id: req.query.pid},
        {$addToSet: {links: {url: req.query.url , title: req.query.title} }}, 
        {safe: true, upsert: true, new:true},
        function(err, project) {
            if(err) {
                //do stuff
            } else {
                //Something was added to set!
            }
        }
   );
});

它工作得很好并且不会添加重复项,但我需要知道什么时候实际更新了什么。现在,你可以看到我已经启用了返回新文档的new:true选项,所以我可以删除它并查看旧版本中是否存在该链接,但有没有办法在启用该标志的情况下执行此操作?

这似乎是一个基本功能,但我在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:0)

由于您要添加一个集合,我们将找到该集合,然后检查我们的更新值是否在集合中。如果是,我们可以结束该功能,否则我们可以更新,同时保持对更新内容的了解。 (这是要点,因为我自己无法测试,可能会有一两个错误。)

router.get('/links/add', function(req, res){
    var updating = false;

    Project.find({_id: req.query.pid}, function(err, project) {
      if(err) {
        // handle error
      } else {
        // Check if found project contains what we mean to update.  
        // If it does already (nothing is changing) leave updating as false
        // and we exit.

        // Otherwise keep reference to what is being updated, set updating to
        // true, and after we finish updating you have reference to what changed
      }
    }
    if(updating) {
      Project.findOneAndUpdate(
          {_id: req.query.pid},
          {$addToSet: {links: {url: req.query.url , title: req.query.title} }}, 
          {safe: true, upsert: true, new:true},
          function(err, project) {
              if(err) {
                  //do stuff
              } else {
                  //Something was added to set!
              }
          }
      );
   }
});