当值嵌套在数组中时如何区分(计数)值?

时间:2018-06-16 20:20:19

标签: node.js mongodb group-by aggregate distinct

我有一个类似这样的数据样本:

"diagnostics" : {

    "_ID" : "554bbf7b761e06f02fef3561",

    "tests" : [ 
        {
            "_id" : "59d678064e4645ec562a37e2",
            "name" : "RBC",
        }, 
        {
            "_id" : "59d678064e4645ec562a37e1",
            "name" : "Calcium",
        }
    ]
}

我希望获得所有测试组的所有不同的_ID和计数 这是这样的:

"_ID" : "554bbf7b761e06f02fef3561"{ {"name" : "Calcium", count :(count of Calcium)},{"name" : "RBC", count :(count of RBC)}

要记住的是,测试是在诊断内部并且包含任意数量的$ name字段,它可以是两个或一个或任意次,并且我想要对每个不同名称进行单独计数。

db.collection('transactions').aggregate([
{ $unwind : '$diagnostics.tests' }, 
  {  $group : {
  _id: {
    "Test_Name" : '$diagnostics.tests.name',
    "ID" : '$diagnostics._id'
  },
  test_count: {  $sum: 1  } 
}
 }  
])

我得到的结果是这样的

[
  {
    "_id": {
      "Test_Name": "Fasting Blood Sugar",
      "ID": "554bbf7b761e06f02fef3561"
    },
    "test_count": 76
  },
  {
    "_id": {
      "Test_Name": "Fasting Blood Sugar",
      "ID": "566726c35dc18d13242fffcc"
    },
    "test_count": 1
  },
  {
    "_id": {
      "Test_Name": "CBC - 7 Part",
      "ID": "566726c35dc18d13242fffcc"
    },
    "test_count": 1
  },
  {
    "_id": {
      "Test_Name": "RBC",
      "ID": "554bbf7b761e06f02fef3561"
    },
    "test_count": 1
  },
  {
    "_id": {
      "Test_Name": "Fasting Blood Sugar",
      "ID": "5a2c9edfe0d0ec71aef1e526"
    },
    "test_count": 6
  },
  {
    "_id": {
      "Test_Name": "Calcium",
      "ID": "554bbf7b761e06f02fef3561"
    },
    "test_count": 77
  }
]

有人可以帮我查询吗?

1 个答案:

答案 0 :(得分:0)

您需要在此处使用多个$group阶段。

首先$unwind测试,$group通过" name"然后将其调整为原始版本,最后调整为$group" diagnostics_ID"对于测试计数,您可以检查"测试的$size"阵列。

db.collection.aggregate([
  { "$unwind": "$diagnostics.tests" },
  { "$group": {
    "_id": {
      "_id": "$diagnostics.tests.name",
      "diagnosticID": "$diagnostics._ID"
    },
    "count": { "$sum": 1 }
  }},
  { "$group": {
    "_id": {
      "_ID": "$_id.diagnosticID"
    },
    "tests": {
      "$push": {
        "name": "$_id._id",
        "count": "$count"
      }
    }
  }},
  { "$project": {
    "diagnostics._ID": "$_id._ID",
    "diagnostics.tests": "$tests",
    "_id": 0,
    "testCount": { "$size": "$tests" }
  }}
])

Code snippet