MongoDB - 来自数组的项目特定元素(大数据)

时间:2018-02-20 14:48:14

标签: mongodb

我得到了一个包含以下格式数据的大数组:

{
  "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

2 个答案:

答案 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)
    }
)