mongodb - mongodb数组中的$sum值
问题描述
我们有一个具有这种形式的 Mongo 集合:
[
{
"_id" : "34210db0-6g91-83e8-ae8c-659f064f503f",
"dateReceived" : ISODate("2018-01-01T00:00:00.000Z"),
"group" : null,
"clientShortName" : "My Client Name",
"sourceShortName" : "Datasource Name",
"files" : [
{
"_id" : "807061f0-2d77-87e8-8610-9ff3cbc9c774"
"status" : 1,
"fileName" : "filename1.csv",
"numRows" : 15,
},
{
"_id" : "587036f0-2n65-55e8-8610-3ee3cbc9c814"
"status" : 8,
"fileName" : "filename2.csv",
"numRows" : 30,
}
]
}
]
我们有一个使用“find”和“map”结合的 Mongo 查询,以产生转换后的输出。查找/映射命令如下所示:
db.getCollection('batches')
.find({_id: "34210db0-6g91-83e8-ae8c-659f064f503f"}, {"__v": false, "files.diffHistory": false})
.map( doc =>
{
doc.id = doc._id;
doc.clientName = doc.clientShortName;
doc.dataSourceName = doc.sourceShortName;
delete doc._id;
delete doc.clientShortName;
delete doc.sourceShortName;
doc.numFiles = NumberInt(doc.files.length);
doc.files = doc.files.map( file =>
{
file.id = file._id;
delete file._id;
delete file.__v;
delete file.edits;
return file;
}
);
// broken....how should this be formatted?
doc.totalNumRows = {$sum: doc.files.numRows};
return doc;
}
)
这个查找/映射工作并产生预期的输出,除了“totalNumRows”求和。我们试图完成的是将所有“files.numRows”字段相加,以便我们在返回的数据集的顶层获得一个汇总条目。即我们会看到一个看起来像这样的结果集:
[
{
"id" : "34210db0-6g91-83e8-ae8c-659f064f503f",
"dateReceived" : ISODate("2018-01-01T00:00:00.000Z"),
"group" : null,
"clientName" : "My Client Name",
"dataSourceName" : "Datasource Name",
"files" : [
{
"id" : "807061f0-2d77-87e8-8610-9ff3cbc9c774"
"status" : 1,
"fileName" : "filename1.csv",
"numRows" : 15,
},
{
"id" : "587036f0-2n65-55e8-8610-3ee3cbc9c814"
"status" : 8,
"fileName" : "filename2.csv",
"numRows" : 30,
}
],
"totalNumRows": 45
}
]
到目前为止,所有尝试都会产生一个损坏的查询。有谁知道总结我们的“文件”子文档的“numRows”字段的正确命令/格式?
解决方案
那么你可以做一些更好更快的方法然后......尝试$project
重命名您的实际字段名称,然后$sum
获得总数numRows
db.collection.aggregate([
{ "$match": { _id: "34210db0-6g91-83e8-ae8c-659f064f503f" }},
{ "$project": {
"totalNumRows": {
"$sum": "$files.numRows"
},
"clientName": "$clientShortName",
"dataSourceName": "$sourceShortName",
"files": "$files"
}}
])
它将给出以下输出
[
{
"_id": 1111,
"clientName": "My Client Name",
"dataSourceName": "Datasource Name",
"files": [
{
"fileName": "filename1.csv",
"id": 2222,
"numRows": 15,
"status": 1
},
{
"fileName": "filename2.csv",
"id": 3333,
"numRows": 30,
"status": 8
}
],
"totalNumRows": 45
}
]
推荐阅读
- python - Numpy 操作结果打印为列表而不是 numpy 数组
- javascript - 有没有办法通过使用 .forEach 或 .map 而不是 for-loop 来解决这个问题?
- hyperledger - Hyperledger Composer 查询语言:如何使用资产 ID 从关系中取回资产?
- javascript - 优化修复html表格标题的功能,根据屏幕大小和内容实时调整不同的宽度
- c# - 如何获得从对象到空间映射的距离
- swift - 从 RSS 或网页解析 XML
- javascript - 如何在 VueJS 中使类的“虚拟”getter 具有响应性
- spring-boot - java.lang.NoSuchMethodError:org.springframework.boot.builder.SpringApplicationBuilder
- django - Django / Django rest framework 查看未捕获的异常
- json - 数据表未检测到 JSON 已被 Angular 读取