如何通过Mongoose中的$ inc增加值

时间:2016-02-26 04:30:46

标签: javascript json node.js mongodb

我正在尝试使用$inc增加字段值而不会取得太大成功。我有以下架构:

var postSchema = mongoose.Schema({
  title         : { type: String, required: true },
  body          : { type: String, default: '' },
  counter       : counterSchema
});

var counterSchema = mongoose.Schema({
  upvotes       : { type: Number, default: 0, min: 0 },
  downvotes     : { type: Number, default: 0, min: 0 },
  view          : { type: Number, default: 0, min: 0 }
});

我正在尝试增加counter中的值,而我所拥有的是:

  ...
  let where = `{ '_id': ObjectId("${req.body.pid}") }`: 
  let update = req.body.action === 'up' ? "{ '$inc': { 'counter.upvotes': 1 } }"
                                        : "{ '$inc': { 'counter.downvotes': 1 } }";

  Post.findOneAndUpdate(where, update, {'new': true}, (err, post) => {
    if (err) return next(err);
    console.log('post=' + JSON.stringify(post));
  ...

我能够使用语句

成功增加mongod
db.posts.update({_id: ObjectId('56cd78fddfe1372131a04b4d')}, {$inc: {'counter.upvotes': 1}})

因此我最初认为它与Mongoose语法有关,并尝试了多种变体,包括:

  1. 使用collection...update().exec(...)格式
  2. 将键和值括在单,双,无引号
  3. 省略ObjectId,即{ '_id': id) }
  4. 但到目前为止还没有运气。任何帮助将不胜感激。

    PS。代码确实成功执行而没有错误,因为我将选项设置为{'new': true},所以我回复了帖子。它只是post.counter。[upvote | downvote]在返回的内容和mongodb中递增。

1 个答案:

答案 0 :(得分:0)

您的whereupdate变量需要包含对象,而不是字符串。

所以它应该是这样的:

let where = { '_id': ObjectId(req.body.pid) };
let update = req.body.action === 'up' ? { '$inc': { 'counter.upvotes': 1 } }
                                      : { '$inc': { 'counter.downvotes': 1 } };