#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 долларов».;
Вам нужно изменить свою логическую структуру.
- Выполните расчет:
SUM((credit*(100-rate))/100)
. - Сгруппируйте по
$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
}
]
Комментарии:
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. я редактирую свой вопрос, а также хочу сказать, что я думаю, что это проблема с моей переменной, такой как кредит и ставка, когда я меняю свою переменную с цифрами, это дало мне действительный выход