创建新对象时,值在猫鼬中不会增加

时间:2020-06-10 00:10:06

标签: node.js mongodb mongoose mongodb-query mean-stack

这是我的代码,我想在任何用户给出评分后立即增加总计数。但是$ inc命令没有运行,结果显示的是我设置为零的默认值。

给出的是我的架构。

const mongoose = require('mongoose');

const schema = mongoose.Schema;

let Rating = new schema({
    user_id:{
        type:mongoose.Types.ObjectId
    },
    stars:{
        type:Number
    },
    ratingCount:{
        type:Number,
        default:0
    }
})

const rating = mongoose.model('Rating', Rating);
module.exports = rating;

这是我要增加值的函数。

const express = require('express');
const Router = express.Router();

let Rating = require('../model/rating');

Router.route('/add/:userid').post((req,res)=>{

    new Rating({
        user_id: req.params.userid,
        $inc: {ratingCount:1},
        stars: req.body.stars
    })
    .save()
    .then(rating=>res.send(rating))
    .catch(err=>console.log(err));

});


module.exports = Router;

结果显示ratingCount的默认值。

enter image description here

1 个答案:

答案 0 :(得分:0)

您不必使用.save(),而可以使用带有选项{ new: true }的{​​{3}}返回更新的文档,如果找不到任何匹配的文档,.findOneAndUpdate()返回null

代码:

const express = require("express");
const Router = express.Router();
let Rating = require("../model/rating");
Router.route("/add/:userid").post((req, res) => {
  Rating.findOneAndUpdate(
    { user_id: req.params.userid },
    { $inc: { ratingCount: 1 }, stars: req.body.stars },
    { new: true }
  )
    .then((rating) => res.send(rating))
    .catch((err) => console.log(err));
});
module.exports = Router;

通常,.save()将跟踪对从查找调用返回的文档的更改。否则,如果不是.find()调用返回的猫鼬文档(如果它是您正在形成的猫鼬对象,就像您现在正在做的那样),那么如果它在对象中找到_id,它将更新匹配的文档其他如果不存在带有_id的匹配文档或请求中不存在_id的文档,则会插入新文档。