[英]Find Sum/Average of values saved with type System.Decimal in mongodb
我想找到集合中某些數據的min
, max
, sum
和average
。 我要對其執行這些操作的字段存儲在文檔中,如下所示:
我運行以下查詢
db.getCollection('WorkingFormDataDetail_0d86f13f-e031-4fe6-9308-9c0b03f5dd20').aggregate([
{
"$match" : {
"DateDeleted" : null,
"ParentFormKeyID" : NUUID("71b0b572-08c4-4093-8ae2-065a62ca4096"),
"FormFieldsData.პაციენტის რეგისტრაციის ადგილი":"ბათუმი"
}
},
{
"$group" : {
_id:"$FormFieldsData.პაციენტის რეგისტრაციის ადგილი",
sum:{$sum: "$FormFieldsData.ფაქტობრივი ხარჯი"},
min:{$min: "$FormFieldsData.ფაქტობრივი ხარჯი"},
max:{$max: "$FormFieldsData.ფაქტობრივი ხარჯი"},
average:{$avg: "$FormFieldsData.ფაქტობრივი ხარჯი"},
count:{ $sum: 1}
},
}
])
響應看起來像這樣:
如您所見,sum和avarege值計算不正確。 有什么解決方案?
這是文檔數據的簡化版本:
{
"_id" : NUUID("fa09b515-42b3-4752-a623-4e472b75be90"),
"FormID" : NUUID("af4499ea-175r-4ac6-9d42-cb7f04b679d4"),
"ContractID" : NUUID("db0b685f-13fr-475d-9106-be94e4a4c756"),
"ParentFormKeyID" : NUUID("cd751b86-833f-4577-9535-456rfde6c1d9"),
"ParentGridID" : null,
"ProviderID" : NUUID("bd44a106-bdeb-45r0-837f-653a663b1f7a"),
"DateCreated" : ISODate("2019-04-17T03:21:20.000Z"),
"DateChanged" : null,
"DateDeleted" : null,
"SubFormsData" : [],
"FormGridsData" : []
"FormFieldsData" : {
"ID" : NUUID("fa09b515-42b3-4792-a623-4e522b75be90"),
"DateCreated" : ISODate("2019-04-17T03:21:20.000Z"),
"ფაქტობრივი ხარჯი" : {
"_t" : "System.Decimal",
"_v" : "0"
},
"CommitStatus" : null,
"ValidationComment" : null
}
}
請按照以下示例更改小組賽階段。 我用數據字段測試了您的匯總,計算工作正常。
{_id:null,
sum:{$sum: "$FormFieldsData.ფაქტობრივი ხარჯი"},
min:{$min: "$FormFieldsData.ფაქტობრივი ხარჯი"},
max:{$max: "$FormFieldsData.ფაქტობრივი ხარჯი"},
average:{$avg: "$FormFieldsData.ფაქტობრივი ხარჯი"},
count:{ $sum: 1}}
即使不是真正的直接答案,這也是我使用MongoDB.Entities包裝器庫解決問題域的方法。 查詢部分與官方驅動程序沒有什么不同。 只需使用collection.AsQueryable()
。
注意:如果使用官方驅動程序,則BsonType.Decimal128
需要與十進制屬性一起使用。 MongoDB.Entities庫不需要它。
using System;
using System.Linq;
using MongoDB.Entities;
using MongoDB.Driver.Linq;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
namespace StackOverflow
{
public class Form : Entity
{
public DateTime? DateDeleted { get; set; }
public string ParentFormKeyID { get; set; }
public Data[] FormFieldsData { get; set; }
}
public class Data
{
public string ID { get; set; }
public DateTime? DateDeleted { get; set; }
public string PlaceOfPatientRegistraiton { get; set; }
[BsonRepresentation(BsonType.Decimal128)]
public decimal ActualCost { get; set; }
}
class Program
{
static void Main(string[] args)
{
new DB("test");
var form = new Form
{
DateDeleted = null,
ParentFormKeyID = "xxx",
FormFieldsData = new[] {
new Data{ ID="aaa", ActualCost = 10.10m, DateDeleted = null, PlaceOfPatientRegistraiton = "Batumi" },
new Data{ ID="bbb", ActualCost = 20.20m, DateDeleted = null, PlaceOfPatientRegistraiton = "Batumi" },
new Data{ ID="ccc", ActualCost = 30.30m, DateDeleted = null, PlaceOfPatientRegistraiton = "Batumi" }
}
};
form.Save();
var res = DB.Collection<Form>()
.Where(f => f.DateDeleted == null && f.ParentFormKeyID == "xxx")
.SelectMany(d => d.FormFieldsData)
.Where(d => d.PlaceOfPatientRegistraiton == "Batumi")
.GroupBy(d => d.PlaceOfPatientRegistraiton)
.Select(g => new
{
Place = g.Key,
Total = g.Sum(d => d.ActualCost),
Minimum = g.Min(d => d.ActualCost),
Maximum = g.Max(d => d.ActualCost),
Average = g.Average(d => d.ActualCost)
}).First();
}
}
}
這是它生成的聚合管道:
[{
"$match": {
"DateDeleted": null,
"ParentFormKeyID": "xxx"
}
}, {
"$unwind": "$FormFieldsData"
}, {
"$project": {
"FormFieldsData": "$FormFieldsData",
"_id": 0
}
}, {
"$match": {
"FormFieldsData.PlaceOfPatientRegistraiton": "Batumi"
}
}, {
"$group": {
"_id": "$FormFieldsData.PlaceOfPatientRegistraiton",
"__agg0": {
"$sum": "$FormFieldsData.ActualCost"
},
"__agg1": {
"$min": "$FormFieldsData.ActualCost"
},
"__agg2": {
"$max": "$FormFieldsData.ActualCost"
},
"__agg3": {
"$avg": "$FormFieldsData.ActualCost"
}
}
}, {
"$project": {
"Place": "$_id",
"Total": "$__agg0",
"Minimum": "$__agg1",
"Maximum": "$__agg2",
"Average": "$__agg3",
"_id": 0
}
}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.