【问题标题】:Insert or Update into MongoDB using mongoose.js使用 mongoose.js 插入或更新到 MongoDB
【发布时间】:2013-07-01 23:56:47
【问题描述】:

我正在使用 node.jsexpress.jsMongoDBmongoose.js 开发一个 REST API,并发现这在 app.put('/api/users/:userId',function(req, res) { }); 的回调中有效

  new User({ userId : requestData.userId}).findByUserId(function (err, users) {
    if (err) {
      response.status = 'Find Error';
      response.error = err;
      debug('ERROR: ', err);
      res.send(response);
    } else if (!users.length) {
      response.status = 'Registered a new user...';
      debug(response.status);
      var newUser = extend(new User({ userId : requestData.userId, created : Date.now() }), requestData);
      newUser.save(function (err, saveduser) {
        if (err) {
          response.status = 'Insert Error';
          response.error = err;
          debug('ERROR: ', err);
        } else {
          response.user = saveduser;
          debug('New user saved: ', saveduser);
        }
        res.send(response);
      });
    } else {
      response.status = 'Found registered user...';
      debug(response.status);
      if (users.length !== 1) {
        response.status = 'Multiple Users error';
        response.error = 'Found more than one user with userId: ' + requestData.userId;
        response.user = users;
        debug('ERROR: Duplicate entries for userId %s. Users are: ', requestData.userId, users);
        res.send(response);
      } else {
        var existingUser = users[0];
        existingUser.updated = Date.now();
        response.user = existingUser;
        existingUser.save(function (err, user) {
          if (err) {
            response.status = 'Insert Error';
            response.error = err;
            debug('ERROR: ', err);
          } else {
            response.user = user;
            debug('User updated: ', user);
          }
          res.send(response);
        });
      }
    }

我看到了upsert 选项,但无法真正理解它。

这绝对不是正确的方法,考虑到基于callback 的模型和其中的error 参数,我还没有找到任何关于如何以正确方式做这件事的好文章.

有人能指出我正确的方向吗?

【问题讨论】:

    标签: node.js mongodb callback express mongoose


    【解决方案1】:

    我认为您关于更新现有用户或创建新用户的单一路线的想法不是一个好主意。相反,请考虑遵循 REST 设计:

    app.post('/api/users', createNewUser);
    app.put('/api/users/:userId', updateUser);
    

    createNewUser 应该只创建一个具有适当属性的新用户对象并在其上调用saveupdateUser 可以做User.update({_id: req.params.userId}, fieldsToChange...。看看您是否可以开始这项工作,并且不要增加复杂性,例如检查已注册的用户,直到简单的创建/更新对工作正常并且您有信心。然后,您可以逐步改进您的代码,使其更加健壮和真实。

    【讨论】:

    • 感谢您的建议。该实体不是用户,我在发布问题前的最后一分钟将其更改为User,但我仍然觉得 PUT 的 URL 会更好地为我服务。但我猜,对重复项的偏执检查可能会被取消。有没有什么方法可以实现一个 PUT 路由,让insertupdate 更优雅一点?
    • 你可以做User.update({userId: req.params.userId}, userData, {upsert: true, multi: false}, ...做一个mongodb upsert操作,这基本上是你正在尝试的。您仍然需要一堆逻辑来了解 mongo 中发生了什么并避免重复记录等。
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多