我有一个cat Owl 模型:


/** USER MODEL */
const UserSchema = new mongoose.Schema(
    {
        username: {
            type: String,
            unique: true,
        },
        password: {
            type: String,
            min: 5
        },
        wallets: [{
            name: {
                type: String,
                required: true
            },
            balance: {
                type: Number,
                required: true
            }

        }],
        transactions: [{
            type: {
                type: String,
                enum: ['expense', 'income']
            },
            label: {
                type: String,
                required: true
            },
            amount: {
                type: Number,
                required: true
            },
            category: {
                type: String,
                required: true
            },
            date: {
                type: Date,
                default: Date.now
            },
            wallet: {
                type: String,
                required: true
            }
        }],
    },
    { timestamps: true }
)

** THE CONTROLLER **

export const addTransaction = async (req, res) => {
    try {
        const { id } = req.params;
        const transaction = req.body.transaction
        const user = await User.findById(id)
        console.log(transaction.wallet)
        const wallet = await User.find(
            { "wallets.name": transaction.wallet })
        console.log(wallet)
        await User.findByIdAndUpdate(id, { $push: { transactions:  
            transaction } })
        res.status(200).json(user);
    } catch (err) {
        res.status(404).json({ message: err.message });
    }
}

req.body.transaction具有:

  • 要减go 钱包余额的金额//交易金额
  • 标签//钱包计算中不需要
  • wallet //需要访问以更改其余额的钱包的名称

当一笔交易完成时,我会得到金额.然后我需要从钱包余额中减go 这笔钱.通过req.body,我得到了walletname和金额.

我需要一个Mongoose查询来查找User.wallets中的钱包并编辑其余额.

我已经try 过findByIdAndUpdate、Find、findOne、findbyID、$Set:

User.findByIdAndUpdate(id, {$set: {"wallets.amount": transaction.amount}}) 

User.findByIdAndUpdate(id, { wallets: { name: transaction.wallet { amount: transaction.amount} }})

我在上面的控制器中使用的User.find函数也返回整个用户,但Wallet是:[[Object],[Object]]

但我觉得我用得不对.

推荐答案

您可以在一次findOneAndUpdate操作中完成此操作.

  1. 通过_id查找用户,其中wallets.name等于transaction.wallet.
  2. $pushtransaction连接到用户transactionsarray.
  3. 将与在滤波器级中找到的$位置运算符匹配的数组元素上的balance减负,有效地减go 它.
const user = await User.findOneAndUpdate(
   {
      _id: id, 
     'wallets.name': transaction.wallet
   },
   {
      $push: {
         'transactions': transaction
      },
      $inc: {
         'wallets.$.balance': -transaction.amount    
      }
   },
   { new: true } 
);

有关完整的工作示例,请参见HERE.

findOneAndUpdate可以采用聚合管道,这样您就可以执行更复杂的更新,但由于您所需要做的只是压入一个数组并扣除一个值,所以我将其保持得很简单.

Node.js相关问答推荐

Mongoose:如何使用填充进行查找

编写动态创建的 YAML - 为生态系统创建 Docker compose 文件(使用 js-yaml)

TS[2339]:类型 '() => Promise<(Document & Omit) | 上不存在属性空>'

无法将示例 Node.js 应用程序部署到 AWS Elastic Beanstalk

合并Shift对象数组以创建最终的排班表

Typescript :泛型类又扩展了另一个泛型类

为什么 nginx 不将我的 react index.html 作为后备服务

我如何保护nodejs中的路由

为什么我的 Cypress Post 请求的请求正文是空的?

如何使用填充在mongoose 上保存新数据

Azure Function 在 2022 年 4 月 26 日禁用将用户字段设置为 HTTP 请求对象

无法更新MongoDB中的文档:";伯森场';writeConcern.w';是错误的类型';数组'&引用;

在 ExpressJS 中将变量传递给 JavaScript

什么使用/尊重 .node-version 文件?

React Native ios build:找不到 node

如何使用 Node.js 在服务器端管理多个 JS 文件

npm install 给出警告,npm audit fix 不起作用

npm install packagename --save-dev 不更新 package.json

Mongoose:模式与模型?

nodemon + express,监听端口=?