将字符串转换为mongodb中数组中的数值和计数和
我想用数组中的字符串类型求总金额,所以我在mongo中写这个。需要帮忙吗 已尝试:将字符串转换为mongodb中数组中的数值和计数和,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想用数组中的字符串类型求总金额,所以我在mongo中写这个。需要帮忙吗 已尝试: db.compte.aggregate([ {$project:{ account: "$auditMessages.eventMetaData.Counterparty Name", amount: "$auditMessages.eventMetaData.Transaction Amount", "total": {$sum:"$amount"} }}]) { "_id" : Obj
db.compte.aggregate([
{$project:{
account: "$auditMessages.eventMetaData.Counterparty Name",
amount: "$auditMessages.eventMetaData.Transaction Amount",
"total": {$sum:"$amount"}
}}])
{
"_id" : ObjectId("5ed638e566a699750cbb1b0f"),
"account" : [
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED"
],
"amount" :
[
"4.32",
"4.32",
"1.32",
"1.32"
],
"total" : 0}
db.collection.aggregate([
{
$project: {
account: { $arrayElemAt: [ "$auditMessages.eventMetaData.Counterparty Name", 0 ] }, // get name from first element in array,use only if name is same in all objects
total: {
$reduce: {
input: "$auditMessages.eventMetaData.Transaction Amount", // Iterate on array
initialValue: 0,
in: { $trunc: [ { $add: [ "$$value", { $toDouble: "$$this" } ] }, 2 ] } // convert string to double, sum-up & truncate to 2 digits
}
}
}
}
])
结果:
db.compte.aggregate([
{$project:{
account: "$auditMessages.eventMetaData.Counterparty Name",
amount: "$auditMessages.eventMetaData.Transaction Amount",
"total": {$sum:"$amount"}
}}])
{
"_id" : ObjectId("5ed638e566a699750cbb1b0f"),
"account" : [
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED"
],
"amount" :
[
"4.32",
"4.32",
"1.32",
"1.32"
],
"total" : 0}
db.collection.aggregate([
{
$project: {
account: { $arrayElemAt: [ "$auditMessages.eventMetaData.Counterparty Name", 0 ] }, // get name from first element in array,use only if name is same in all objects
total: {
$reduce: {
input: "$auditMessages.eventMetaData.Transaction Amount", // Iterate on array
initialValue: 0,
in: { $trunc: [ { $add: [ "$$value", { $toDouble: "$$this" } ] }, 2 ] } // convert string to double, sum-up & truncate to 2 digits
}
}
}
}
])
您正在
$project
中创建amount
字段,并在同一阶段使用它本身,这就是为什么它在“total”上返回0
:{$sum:$amount”}
,而且$sum
似乎不接受数组
假设您的文档看起来像:
{
"auditMessages": {
eventMetaData: [
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 1,
"Transaction Amount": "4.32"
},
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 11,
"Transaction Amount": "4.32"
},
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 12,
"Transaction Amount": "1.32"
},
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 122,
"Transaction Amount": "1.32"
}
]
}
}
AsauditMessages.eventMetaData
是一个数组,执行以下操作时:
“$auditMessages.eventMetaData.contractor Name”
或“$auditMessages.eventMetaData.Transaction Amount”
那么您得到的是一个值数组,就像您现在在结果中看到的值一样
查询:
db.compte.aggregate([
{$project:{
account: "$auditMessages.eventMetaData.Counterparty Name",
amount: "$auditMessages.eventMetaData.Transaction Amount",
"total": {$sum:"$amount"}
}}])
{
"_id" : ObjectId("5ed638e566a699750cbb1b0f"),
"account" : [
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED"
],
"amount" :
[
"4.32",
"4.32",
"1.32",
"1.32"
],
"total" : 0}
db.collection.aggregate([
{
$project: {
account: { $arrayElemAt: [ "$auditMessages.eventMetaData.Counterparty Name", 0 ] }, // get name from first element in array,use only if name is same in all objects
total: {
$reduce: {
input: "$auditMessages.eventMetaData.Transaction Amount", // Iterate on array
initialValue: 0,
in: { $trunc: [ { $add: [ "$$value", { $toDouble: "$$this" } ] }, 2 ] } // convert string to double, sum-up & truncate to 2 digits
}
}
}
}
])
测试:
Ref:您正在
$project
中创建amount
字段,并在同一阶段使用它本身,这就是为什么它在“total”上返回0
:{$sum:$amount}
,而且$sum
似乎不接受数组
假设您的文档看起来像:
{
"auditMessages": {
eventMetaData: [
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 1,
"Transaction Amount": "4.32"
},
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 11,
"Transaction Amount": "4.32"
},
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 12,
"Transaction Amount": "1.32"
},
{
"Counterparty Name": "Mr Jalel CHAHED",
abc: 122,
"Transaction Amount": "1.32"
}
]
}
}
AsauditMessages.eventMetaData
是一个数组,执行以下操作时:
“$auditMessages.eventMetaData.contractor Name”
或“$auditMessages.eventMetaData.Transaction Amount”
那么您得到的是一个值数组,就像您现在在结果中看到的值一样
查询:
db.compte.aggregate([
{$project:{
account: "$auditMessages.eventMetaData.Counterparty Name",
amount: "$auditMessages.eventMetaData.Transaction Amount",
"total": {$sum:"$amount"}
}}])
{
"_id" : ObjectId("5ed638e566a699750cbb1b0f"),
"account" : [
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED",
"Mr Jalel CHAHED"
],
"amount" :
[
"4.32",
"4.32",
"1.32",
"1.32"
],
"total" : 0}
db.collection.aggregate([
{
$project: {
account: { $arrayElemAt: [ "$auditMessages.eventMetaData.Counterparty Name", 0 ] }, // get name from first element in array,use only if name is same in all objects
total: {
$reduce: {
input: "$auditMessages.eventMetaData.Transaction Amount", // Iterate on array
initialValue: 0,
in: { $trunc: [ { $add: [ "$$value", { $toDouble: "$$this" } ] }, 2 ] } // convert string to double, sum-up & truncate to 2 digits
}
}
}
}
])
测试:
Ref:当前查询有什么问题?目前的结果是什么?预期的结果是什么?我想合计金额,合计为11.28(4.32+4.32+1.32+1.32),但合计为0。这应该很容易,只需在此处按id或主列分组,然后对金额进行合计。你可能需要另一条管道。由于我们不知道
compte
集合的外观,我们无法提供此问题的任何具体解决方案。我使用了分组方式,相同的结果总计0当前查询的问题是什么?目前的结果是什么?预期的结果是什么?我想合计金额,合计为11.28(4.32+4.32+1.32+1.32),但合计为0。这应该很容易,只需在此处按id或主列分组,然后对金额进行合计。你可能需要另一条管道。由于我们不知道compte集合是什么样子的,我们无法提供此问题的任何具体解决方案。我使用了group by,相同的结果总计0如何获得一个名称,例如Jarel CHAHED先生,总数为4谢谢@m1h3r:我不明白你的意思!如何才能得到一个名字,例如Jarel CHAHED先生,总数是4谢谢@m1h3r:我不明白你的意思!