web-dev-qa-db-ja.com

$ incを使用してMongooseでドキュメントプロパティをインクリメントする

ドキュメントにアクセスするたびに、viewsカウントを1ずつ増やしたいと思います。これまでのところ、私のコードは次のとおりです。

Document
    .find({})
    .sort('date', -1)
    .limit(limit)
    .exec();

どこでやる $incここに収まりますか?

16
Randomblue

Mongooseを使用したことはありませんが、ドキュメントをすばやく確認します ここ これでうまくいくようです:

# create query conditions and update variables
var conditions = { },
    update = { $inc: { views: 1 }};

# update documents matching condition
Model.update(conditions, update).limit(limit).sort('date', -1).exec();

乾杯と幸運を!

35
Tyler Brock

$ incに関連する別の問題が発生しました。他の誰かに役立つ可能性があるので、ここに投稿します。私は次のコードを持っています:

var Schema = require('models/schema.js');

var exports = module.exports = {};

exports.increase = function(id, key, amount, callback){
   Schema.findByIdAndUpdate(id, { $inc: { key: amount }}, function(err, data){
      //error handling
   }
}

別のモジュールから私は次のようなものを呼び出すでしょう

var saver = require('./saver.js');

saver.increase('555f49f1f9e81ecaf14f4748', 'counter', 1, function(err,data){
    //error handling
}

ただし、これによって目的のカウンターが増えることはありません。どうやら、キーを更新オブジェクトに直接渡すことは許可されていません。これは、オブジェクトフィールド名の文字列リテラルの構文と関係があります。解決策は、次のように更新オブジェクトを定義することでした。

exports.increase = function(id, key, amount, callback){

   var update = {};
   update['$inc'] = {};
   update['$inc'][key] = amount;

   Schema.findByIdAndUpdate(id, update, function(err, data){
      //error handling
   }
}
8
peerbolte

私のために働く(マングース5.7)

blogRouter.put("/:id", async (request, response) => {
        try {
                const updatedBlog = await Blog.findByIdAndUpdate(
                        request.params.id,
                        {
                                $inc: { likes: 1 }
                        },
                        { new: true } //to return the new document
                );
                response.json(updatedBlog);
        } catch (error) {
                response.status(400).end();
        }
});
0
Ahmed_4EGA