ドキュメントにアクセスするたびに、views
カウントを1ずつ増やしたいと思います。これまでのところ、私のコードは次のとおりです。
Document
.find({})
.sort('date', -1)
.limit(limit)
.exec();
どこでやる $inc
ここに収まりますか?
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();
乾杯と幸運を!
$ 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
}
}
私のために働く(マングース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();
}
});