【问题标题】:Create Rating if Not Rated Yet, Update User Rating if Rating Exists如果尚未评分,则创建评分,如果评分存在则更新用户评分
【发布时间】:2019-04-18 23:51:00
【问题描述】:

我正在创建一种用户体验,用户将能够对来自不同供应商的商品进行评分。我最初的想法是让每个用户模式都有一个数组来存储用户评分的所有项目。评级项目将包括唯一的供应商项目 ID 和数字评级值。

用户模型

const userSchema = new mongoose.Schema({
  ...
  userType: String,
  ratedItems: Array,
  ...
});

控制器

exports.postUpdateRatedItem = (req, res, next) => {
  User.findById(req.user.id,  (err, user) => {
    if (err) { return next(err); }
    user.update(
      { $push: {ratedItems : {
        vendorItem : req.body.itemID,
        rating : req.body.rating
      }}},

      function (err) {
        res.send(200);
    });

  });
}

电流输出

{ 
  "_id" : ObjectId("5c91869a71ece20551fd6aed"),
  "userType" : "participant",
  "ratedItems" : [ 
    { "vendorItem" : "5c9bdd524a0dfa753e08a0a4", "rating" : "3" },
    { "vendorItem" : "5c9bdd524a0dfa753e08a0a4", "rating" : "6" }
  ]
}

这种方法在向数组中添加新对象时效果很好,但只添加而不更新。相反,每次用户更新评分时,都会将一个新对象添加到数组中。什么方法可以检查唯一的 vendorItem id?如何检查用户评分的项目?如果找到,更新评分值,如果没有找到,推送到数组。

提前谢谢你,还在学习 MongoDB/Mongoose。

编辑

以下是我预期的结果。对于数组中的每个对象,“评分”会在用户更改评分时更新。 ratedItems 数组最终会有很多 vendorItem 具有唯一的 ID 和评级。

预期输出

{ 
  "_id" : ObjectId("5c91869a71ece20551fd6aed"),
  "userType" : "participant",
  "ratedItems" : [ 
    { "vendorItem" : "5c9bdd524a0dfa753e08a0a4", "rating" : "6" },
    // additional rated items all with unique IDs
    { "vendorItem" : "5c9bcc14d5161c38a4581e28", "rating" : "2" },
    { "vendorItem" : "5c9407d143cd0f20d758acdb", "rating" : "11" }

  ]
}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    听起来您正在寻找“upsert”功能。 Mongoose 模型 API 为此提供了findByIdAndUpdate 和其他类似方法。

    确保将 newupsert 选项设置为 true。如果对象不存在,这将创建对象,如果更新,则返回修改后的文档。

    您的用例将如下所示:

    const update = {
      $push: {
        ratedItems: {
          vendorItem: req.body.itemID,
          rating: req.body.rating
        }
      }
    };
    
    const options = {'new': true, upsert: true};
    
    User.findByIdAndUpdate(req.user.id, update, options, function(err, user) {
      // ...
    });
    

    【讨论】:

    • 感谢您的回复。不幸的是,这似乎继续添加到数组中,而不是更新数组中匹配的vendorItem。我假设有某种方法可以搜索ratedItems 以查找匹配的vendorItem 并更新rating。如果vendorItem 不存在,则将该对象添加到数组中。
    • 您必须设置您的update 对象才能实现所需的行为。见stackoverflow.com/questions/15691224/…
    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多