通过mongoose更新mongodb中的一些字段

时间:2015-07-16 10:30:35

标签: node.js mongodb express mongoose

我正在尝试构建一个简单的RESTful API,我无法弄清楚如何通过mongoose正确更新我的mongodb中的某些字段。

这是我的方案:

   Sound = new Schema({
    "title"    : String,
    "url"     : String,
    "time"  : Number,
    "like"  : {
        "count": Number,
        "timestamps": [Number]
   }
}),

  Artist = new Schema({
    "author"            : String,
    "url_to_author_image"   : String,
    "bio"               : String,
    "sounds"             : [Sound]
});

当有人向/ like / sound_id发送请求时,我需要增加喜欢的数量并将时间戳添加到数组中。到目前为止,我有这样的事情:

router.post("/like/:sound_id", function(req, res){
  var time = Date.now();

  Artist.findOneAndUpdate( {"sounds._id":req.params.sound_id},
  { $inc : { "sounds.$.like.count" : 1 } },
  { $push : { "sounds.$.like.timestamps": time } }, function(err,doc){
    if (!err) res.json({message: "wuuuuhuuu"});
  });
});

但推动部分似乎是错误的。

2 个答案:

答案 0 :(得分:0)

这是有效的,但我不确定,它是否是最有效的解决方案。

Artist.find({"sounds._id":req.params.sound_id}, function(err, sound){
    sound[0].sounds.id(req.params.sound_id).like.count++;
    sound[0].sounds.id(req.params.sound_id).like.timestamps.push(time);
    sound[0].save(function(err){
      if (!err) res.send(200);
    });
  }); 

答案 1 :(得分:0)

您需要将$inc$push合并为一个对象,否则$push将被解释为options参数:

Artist.findOneAndUpdate(
  { "sounds._id": req.params.sound_id },
  { $inc : { "sounds.$.like.count" : 1 },
    $push : { "sounds.$.like.timestamps": time } },
  function(err,doc){
    if (!err) res.json({message: "wuuuuhuuu"});
  });