我得到了一个包含以下格式数据的大数组:
{
"application": "myapp",
"buildSystem": {
"counter": 2361.1,
"hostname": "host.com",
"jobName": "job_name",
"label": "2361",
"systemType": "sys"
},
"creationTime": 1517420374748,
"id": "123",
"stack": "OTHER",
"testStatus": "PASSED",
"testSuites": [
{
"errors": 0,
"failures": 0,
"hostname": "some_host",
"properties": [
{
"name": "some_name",
"value": "UnicodeLittle"
},
<MANY MORE PROPERTIES>,
{
"name": "sun",
"value": ""
}
],
"skipped": 0,
"systemError": "",
"systemOut": "",
"testCases": [
{
"classname": "IdTest",
"name": "has correct representation",
"status": "PASSED",
"time": "0.001"
},
<MANY MORE TEST CASES>,
{
"classname": "IdTest",
"name": "normalized values",
"status": "PASSED",
"time": "0.001"
}
],
"tests": 8,
"time": 0.005,
"timestamp": "2018-01-31T17:35:15",
"title": "IdTest"
}
<MANY MORE TEST SUITES >,
]}
我可以用大数据区分三个主要结构:TestSuites,Properties和TestCases。我的任务是总结每个TestSuite的所有时间,以便我可以获得测试的总持续时间。由于属性和TestCase很大,查询无法完成。我想只选择&#34;时间&#34;来自TestSuites的价值,但它与&#34; time&#34;我的查询中的TestCases:
db.my_tests.find(
{
application: application,
creationTime:{
$gte: start_date.valueOf(),
$lte: end_date.valueOf()
}
},
{
application: 1,
creationTime: 1,
buildSystem: 1,
"testSuites.time": 1,
_id:1
}
)
是否可以仅投影&#34;时间&#34; TestSuites的属性没有加载整个架构?我已经尝试过testSuites:1,testSuites。$。时间:1没有成功。请注意,TestSuites是一个包含字典的元素数组。
我已经检查过这个类似的帖子但没有成功: Mongodb update the specific element from subarray
答案 0 :(得分:0)
是否可以仅投射TestSuites的“时间”属性 没有加载整个架构?我已经尝试过testSuites:1, testSuites。$。time
回答你的问题只能预测testSuites文档的time属性,你只需尝试使用“testSuites.time”进行投影:1(你需要添加点符号属性引用的引号)。
我的任务是总结每个TestSuite的所有时间,以便我可以得到 总测试持续时间。由于属性和TestCases是 巨大的,查询无法完成
至于你的任务,我建议你尝试使用mongodb的聚合框架来计算文档转换。如果您正在处理“大型”文档,聚合框架选项{allowDiskUse:true}也会对您有所帮助。
答案 1 :(得分:0)
以下代码打印每个TestSuite的持续时间:
query = db.my_collection.aggregate(
[
{$match: {
application: application,
creationTime:{
$gte: start_date.valueOf(),
$lte: end_date.valueOf()
}
}
},
{ $project :
{ duration: { $sum: "$testSuites.time"}}
}
]
).forEach(function(doc)
{
print(doc._id)
print(doc.duration)
}
)