Mongodb 子文档中的Mongoose聚合管道连接字段

Mongodb 子文档中的Mongoose聚合管道连接字段,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有以下3个系列: 1. runs: { "_id":ObjectId("5cda6191e1b7c889e0442dff"), "status":1, "runName":"My Run Test 01" } 我想将这3个集合聚合为一个文档,如下所示: [ { "_id": "5cda6191e1b7c889e0442dff", "status": 1, "runName": "My Run Test 01", "runsetitems": [

我有以下3个系列:

1. runs:
{
  "_id":ObjectId("5cda6191e1b7c889e0442dff"),
  "status":1,
  "runName":"My Run Test 01"
}
我想将这3个集合聚合为一个文档,如下所示:

[
  {
    "_id": "5cda6191e1b7c889e0442dff",
    "status": 1,
    "runName": "My Run Test 01",
    "runsetitems": [
      {
        "_id": "5cda6191e1b7c889e0442e01",
        "_run": "5cda6191e1b7c889e0442dff",
        "_config": "Config 1",
        "suites": [
          {
            "_id": "5cda6191e1b7c889e0442e03",
            "suiteid": "5c748822e0ae897b0c312719",
            "suitename": "My Test Suite 1",
            "suitedesc": "My Test Suite 1 Description",
            "tests": [
              {
                "_id": "5cda6191e1b7c889e0442e04",
                "testid": "5c746708cefe8d75349b6486",
                "testname": "Buy items with validations 002",
                "testdesc": "Buy more than one items and validate price",
                "testitem": {
                  "status": 1
                }
              }
            ]
          }
        ]
      }
    ]
  }
]
"tests": {
  "testitem": [
    {
       "_id": "5cda67d4e494c61d30cee5d6",
       "status": 1
    }
  ]
}
但有两个问题:

首先,加入_test和suites.tests.testid不起作用。包含时,它返回testitem:[]

如果我删除了上面提到的连接,testitem将返回,但它会产生另一个问题。它将删除测试的属性“testname”和“testdesc”,如下所示:

[
  {
    "_id": "5cda6191e1b7c889e0442dff",
    "status": 1,
    "runName": "My Run Test 01",
    "runsetitems": [
      {
        "_id": "5cda6191e1b7c889e0442e01",
        "_run": "5cda6191e1b7c889e0442dff",
        "_config": "Config 1",
        "suites": [
          {
            "_id": "5cda6191e1b7c889e0442e03",
            "suiteid": "5c748822e0ae897b0c312719",
            "suitename": "My Test Suite 1",
            "suitedesc": "My Test Suite 1 Description",
            "tests": [
              {
                "_id": "5cda6191e1b7c889e0442e04",
                "testid": "5c746708cefe8d75349b6486",
                "testname": "Buy items with validations 002",
                "testdesc": "Buy more than one items and validate price",
                "testitem": {
                  "status": 1
                }
              }
            ]
          }
        ]
      }
    ]
  }
]
"tests": {
  "testitem": [
    {
       "_id": "5cda67d4e494c61d30cee5d6",
       "status": 1
    }
  ]
}

任何建议都将不胜感激

在数组的数组中嵌套了
testid
。您需要首先执行
套件
套件.测试
,然后管理相同的订单

db.runs.aggregate([
  { "$lookup": {
    "from": "runsets",
    "let": { "runid": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_run", "$$runid"] }}},
      { "$unwind": "$suites" },
      { "$unwind": "$suites.tests" },
      { "$lookup": {
        "from": "testresults",
        "let": { "runsetid": "$_id", "testid": "$suites.tests.testid" },
        "pipeline": [
          { "$match": {
            "$expr": {
              "$and": [
                { "$in": ["$_test", "$$testid"] },
                { "$eq": ["$_runset", "$$runsetid"] }
              ]
            }
          }},
          { "$project": { "status": 1 }}
        ],
        "as": "suites.tests.testitem"
      }},
      { "$unwind": "$suites.tests.testitem" },
      { "$group": {
        "_id": { "_id": "$_id", "suiteid": "$suites._id" },
        "_run": { "$first": "$_run" },
        "suiteid": { "$first": "$suites.suiteid" },
        "suitename": { "$first": "$suites.suitename" },
        "config": { "$first": "$config" },
        "config": { "$first": "$config" },
        "tests": { "$push": "$suites.tests" }
      }},
      { "$group": {
        "_id": "$_id._id",
        "_run": { "$first": "$_run" },
        "config": { "$first": "$config" },
        "suites": {
          "$push": {
            "_id": "$_id.suiteid",
            "tests": "$tests",
            "suiteid": "$suiteid",
            "suitename": "$suitename"
          }
        }
      }}
    ],
    "as": "runsetitems"
  }},
  { "$project": {
    "_id": 1,
    "runName": 1,
    "runDesc": 1,
    "status": 1,
    "submitTime": 1,
    "endTime": 1,
    "runsetitems": 1,
    "projectitem.projectName": 1
  }}
])

这很有魅力,完全解决了我提出的两个问题。非常感谢你!
db.runs.aggregate([
  { "$lookup": {
    "from": "runsets",
    "let": { "runid": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_run", "$$runid"] }}},
      { "$unwind": "$suites" },
      { "$unwind": "$suites.tests" },
      { "$lookup": {
        "from": "testresults",
        "let": { "runsetid": "$_id", "testid": "$suites.tests.testid" },
        "pipeline": [
          { "$match": {
            "$expr": {
              "$and": [
                { "$in": ["$_test", "$$testid"] },
                { "$eq": ["$_runset", "$$runsetid"] }
              ]
            }
          }},
          { "$project": { "status": 1 }}
        ],
        "as": "suites.tests.testitem"
      }},
      { "$unwind": "$suites.tests.testitem" },
      { "$group": {
        "_id": { "_id": "$_id", "suiteid": "$suites._id" },
        "_run": { "$first": "$_run" },
        "suiteid": { "$first": "$suites.suiteid" },
        "suitename": { "$first": "$suites.suitename" },
        "config": { "$first": "$config" },
        "config": { "$first": "$config" },
        "tests": { "$push": "$suites.tests" }
      }},
      { "$group": {
        "_id": "$_id._id",
        "_run": { "$first": "$_run" },
        "config": { "$first": "$config" },
        "suites": {
          "$push": {
            "_id": "$_id.suiteid",
            "tests": "$tests",
            "suiteid": "$suiteid",
            "suitename": "$suitename"
          }
        }
      }}
    ],
    "as": "runsetitems"
  }},
  { "$project": {
    "_id": 1,
    "runName": 1,
    "runDesc": 1,
    "status": 1,
    "submitTime": 1,
    "endTime": 1,
    "runsetitems": 1,
    "projectitem.projectName": 1
  }}
])