错误{MongoError:未知修饰符:$ pushAll用猫鼬更新时

时间:2019-05-16 02:52:03

标签: node.js mongodb mongoose

我正在将AngularJS应用程序转换为Angular 7,它们共享一个后端API。我正在提交相同的数据,并且它正确记录了日志,但是当尝试保存记录时,后端出现有关未知修饰符$ pushAll的错误。

我的控制器代码:

    Volunteer
    .findById(volunteerId)
    .select('shifts')
    .exec(function(err, volunteer) {
      var thisShift;
      var response = {
        status : 200,
        message : {}
      };
      if (err) {
        console.log("Error finding volunteer request");
        response.status = 500;
        response.message = err;
      } else if(!volunteer) {
        console.log("Volunteer request not found", volunteerId);
        response.status = 404;
        response.message = {
          "message" : "Volunteer request not found " + volunteerId
        };
      } else {
        // Get the shift
        thisShift = volunteer.shifts.id(shiftId);
        console.log("SHIFT BEFORE UPDATE", JSON.stringify(thisShift));
        // If the shift doesn't exist Mongoose returns null
        if (!thisShift) {
          response.status = 404;
          response.message = {
            "message" : "Shift not found " + shiftId
          };
        }
      }
      if (response.status !== 200) {
        res
          .status(response.status)
          .json(response.message);
      } else {
        thisShift.volleyteers.push({
          fullname: user.name,
          phone: user.phone,
          email: user.username
        });
        console.log("thisShift to be saved", JSON.stringify(thisShift));
        volunteer.save(function(err, volunteerUpdated) {
          if (err) {
            console.log("ERROR",err);
            res
              .status(500)
              .json(err);
          } else {
            console.log("SUCCESS!");
            res
              .status(204)
              .json({message: "Thank you for volunteering!  You can see where you need to on your profile page or someone will contact you."});
          }
        });
      }
    });
};

我得到的错误以及后端上的console.logged内容是: My console.logged data and error

我正在使用:

  • 节点11.13.0
  • MongoDB服务器版本:4.0.8
  • “猫鼬”:“ ^ 4.9.6”

如何解决此错误,以便保存更新的记录?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。问题是$ pushall函数已被弃用,但某些旧版本的Mongoose仍在使用它。我将Mongoose升级到版本5.6.11(最新版本),问题不再存在。

P / S:如果您使用mongoose-unique-validator插件,也应该对其进行升级(我已升级到2.0.3版)

希望有帮助

答案 1 :(得分:0)

issue comes to mind$pullAll在MongoDB中已弃用,但在猫鼬的背后被利用。

解决方法似乎是在this之前的版本5.0.0-rc2之前向架构中添加usePushEach: true

这段代码似乎是造成这种情况的原因:

thisShift.volleyteers.push({
   fullname: user.name,
   phone: user.phone,
   email: user.username
});

因为您要猫鼬保存对象数组。

猫鼬在幕后不使用的另一种解决方法$pushAll似乎是尝试使用concat:

thisShift.volleyteers.concat([{
   fullname: user.name,
   phone: user.phone,
   email: user.username
}]);

specified here