【问题标题】:mongodb query vs mysqlmongodb查询与mysql
【发布时间】:2021-10-30 17:47:05
【问题描述】:

我有以下 MySQL 查询,其中我完成了总利润,我有如下字段:利率,信用(货币)

SELECT SUM((credit*(100-rate))/100) FROM roznamcha WHERE  (accountNum=$id AND rate!=0.0)'

我使用 node.js 在 mongodb 中编写了以下查询,但无论我的数据库中有一些数据,它都会返回 null

    const profit=await roznamcha.aggregate([  
        {
            $match:{
                rate:{$ne:0}
            }
        },
        {
            $group:{
                _id :'$accountNum',
            }
        },
        {
        $addFields:{
                resultMultiply:{
                   $divide:[
                       {$multiply:['$credit','$rate-$100']},100
                   ]

                },
    sumcredit:{
        $sum:'$resultMultiply'
    }
         } }
        
    ])
    res.status(201).json({
        status:'success',
       
        data:{
           profit
        }
    })

我的输出:

    {
    "status": "success",
    "data": {
        "profit": [
            {
                "_id": "612deac8fbc8ef21a0fa4ea7",
                "resultMultiply": null,
                "sumcredit": 0
            },
            {
                "_id": "612223327e2af83a4cec1272",
                "resultMultiply": null,
                "sumcredit": 0
            }
        ]
    }

我的架构:

const mongoose = require('mongoose');

const roznamchaSchem=mongoose.Schema({
    accountNum: {
        type:mongoose.Schema.ObjectId,
        ref:'account',
        required: ['please specify this record is from who', true],
    },
    credit: {
        type: Number,
        default: 0
    },
    debit: {
        type: Number,
        default: 0
    },
    rate: {
        type: Number,
        default: 0
    },
description:{
        type:String,
        required:['description can not be empty',true],
        minlength: 8
    },
    issueDate:{
            type: Date,
            required:['add an valide date',true]
}
});
roznamchaSchem.index({accountNum:-1});
const Roznamcha=mongoose.model('roznamcha',roznamchaSchem);
module.exports=Roznamcha;

还有我的文档示例:

id:612f533e8eb5533f303966e4
credit:50
debit:0
rate:2
accountNum:612deac8fbc8ef21a0fa4ea7
description:"this it for you"
issueDate:6543-01-01T00:00:00.000+00:00

谁能指导我解决这个问题?

【问题讨论】:

  • 您可以添加您的架构模型和文档示例吗?

标签: node.js mongodb express mongoose nosql


【解决方案1】:

除了@Joe 和@Nenad 之外,还回答了减法错误:'$rate-$100';

你需要重新定位你的逻辑结构。

  1. 执行计算:SUM((credit*(100-rate))/100)
  2. $accountNum 分组,并为resultMultiply 聚合SUM
db.collection.aggregate([
  {
    $match: {
      rate: {
        $ne: 0
      }
    }
  },
  {
    $addFields: {
      resultMultiply: {
        $divide: [
          {
            $multiply: [
              "$credit",
              {
                "$subtract": [
                  100,
                  "$rate"
                ]
              }
            ]
          },
          100
        ]
      }
    }
  },
  {
    $group: {
      _id: "$accountNum",
      total: {
        $sum: "$resultMultiply"
      }
    }
  }
])

输出

[
  {
    "_id": 2,
    "total": 1.5
  },
  {
    "_id": 1,
    "total": 5.5
  }
]

Sample MongoDB playground

【讨论】:

  • 为什么我不能在$addfiled阶段添加$sum?
  • 因为作为您的 MongoDB 查询,如果在小组赛阶段不进行 sum 聚合,您将无法将 resultMultiplyaccountNum 相加。
【解决方案2】:

'$rate-$100' 指的是名为“rate-$100”的字段。您可能打算使用减法

{$subtract: [ 100, "$rate"]}

【讨论】:

    【解决方案3】:

    你不能使用数学运算符减号进行减法,你必须使用$subtract聚合运算符。

    resultMultiply: {
      $divide: [{
          $multiply: [
            "$credit",
            { $subtract: [ 100, "$rate" ] }
          ]
        },
        100
      ]
    }
    

    【讨论】:

    • 我将减号更改为 $subtract 但我仍然返回 null
    • 您能否在您的问题中添加架构模型和文档示例?
    • 我编辑了我的问题,而且我想说我认为这是我的变量(如信用和利率)的问题,当我用数字更改变量时,它给了我一个有效的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2022-01-18
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多