запрос mongodb против mysql

#node.js #mongodb #express #mongoose #nosql

Вопрос:

У меня есть следующий запрос MySQL, в котором я сделал сумму прибыли, в которой у меня есть такие поля, как: ставка, кредит(деньги)

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

Я написал следующий запрос в mongodb, используя node.js но он возвращает значение 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
 

может ли кто-нибудь помочь мне в решении этого вопроса?

Комментарии:

1. Можете ли вы добавить свою модель схемы и образец документа?

Ответ №1:

Кроме того, @Joe и @Nenad отвечают на ошибку вычитания: «ставка $-100 долларов».;

Вам нужно изменить свою логическую структуру.

  1. Выполните расчет: SUM((credit*(100-rate))/100) .
  2. Сгруппируйте по $accountNum и агрегируйте SUM для resultMultiply .
 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
  }
]
 

Пример игровой площадки MongoDB

Комментарии:

1. почему я не могу добавить сумму $на этапе $addfiled?

2. Потому что, как ваш запрос MongoDB, без агрегирования суммы на групповом этапе вы не сможете суммировать resultMultiply по accountNum .

Ответ №2:

'$rate-$100' имеет в виду поле с именем «ставка-100 долларов». Вы, вероятно, хотели вычесть, используя

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

Ответ №3:

Вы не можете использовать математический оператор минус для вычитания, вы должны использовать $subtract оператор агрегации.

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

Комментарии:

1. я меняю минус на вычитание $, но все равно возвращаю null

2. Можете ли вы добавить модель схемы и пример документа в свой вопрос?

3. я редактирую свой вопрос, а также хочу сказать, что я думаю, что это проблема с моей переменной, такой как кредит и ставка, когда я меняю свою переменную с цифрами, это дало мне действительный выход