使用$ inc使用Mongoose增加文档属性

时间:2011-12-24 00:56:25

标签: mongodb mongoose

每次访问我的文档时,我想将views计数增加1。到目前为止,我的代码是:

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

$inc在哪里适合?

3 个答案:

答案 0 :(得分:35)

从未使用过mongoose,但很快查看了文档here,这似乎对您有用:

# 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();

干杯,祝你好运!

答案 1 :(得分:7)

我遇到了另一个问题,这与$ 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
   }
}

答案 2 :(得分:0)

为我工作(猫鼬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();
	}
});