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

Posted

技术标签:

【中文标题】创建新对象时,猫鼬中的值不会增加【英文标题】:Value not incrementing in mongoose when creating a new object 【发布时间】:2020-09-29 07:04:18 【问题描述】:

这是我的代码,我想在任何用户给出评分后立即增加计数总数。但是 $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 的默认值。

【问题讨论】:

请不要包含图片,有文字格式的代码!!你想同时将req.body.stars 设置为stars & inc ratingCount 吗? 是的,这就是我想要的 我已经更新了格式 如果@whoami 的回答解决了您的问题,请采纳(What should I do when someone answers my question?)表示您的问题已结束,否则请留言告知 whoami 和任何读者 【参考方案1】:

您不需要使用.save(),而是可以简单地使用.findOneAndUpdate() 和选项 new: true 来返回更新的文档,如果它没有找到任何匹配的文档.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 调用返回的文档的更改。否则,如果它不是从.find() 返回的猫鼬文档,如果它是你正在形成的猫鼬对象,就像你现在正在做的那样,那么如果它在对象中找到_id,它将更新匹配的文档,否则如果没有匹配的文档存在 _id 或在请求中不存在 _id 时,它将插入新文档。

【讨论】:

以上是关于创建新对象时,猫鼬中的值不会增加的主要内容,如果未能解决你的问题,请参考以下文章

文档创建猫鼬中的自动增量版本

在猫鼬中,如何根据相关集合中的值查找记录?

猫鼬中的最小和最大数量验证

猫鼬中的虚拟对象,“this”是空对象

猫鼬中的 findOne 返回空对象,然后返回正确的对象

从猫鼬中的数组对象中选择特定项目