首页 > 解决方案 > mongodb聚合-嵌套组

问题描述

我正在尝试执行嵌套组,我有一个包含两个键(invoiceIndex、procedureIndex)的文档数组我需要像这样排列文档

invoices (parent) -> procedures (children)

invoices: [ // Array of invoices
   {
    ..... 
   "procedures": [{}, ...] // Array of procedures
  }
]

这是一个示例文档

{
    "charges": 226.09000000000003,
    "currentBalance": 226.09000000000003,
    "insPortion": "",
    "currentInsPortion": "",
    "claim": "notSent",
    "status": "unpaid",
    "procedures": {
      "providerId": "9vfpjSraHzQFNTtN7",
      "procedure": "21111",
      "description": "One surface",
      "category": "basicRestoration",
      "surface": [
        "m"
      ],
      "providerName": "B Dentist",
      "proceduresIndex": "0"
    },
    "patientId": "mE5vKveFArqFHhKmE",
    "patientName": "Silvia Waterman",
    "invoiceIndex": "0",
    "proceduresIndex": "0"
}

这是我尝试过的

https://mongoplayground.net/p/AEBGmA32n8P

标签: mongodbaggregation-framework

解决方案


您可以尝试以下方法吗?

db.collection.aggregate([
  {
    $group: {
      _id: "$invoiceIndex",
      procedures: {
        $push: "$procedures"
      },
      invoice: {
        $first: "$$ROOT"
      }
    }
  },
  {
    $addFields: {
      "invoice.procedures": "$procedures"
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$invoice"
    }
  }
])

我将invoice字段保留为invoice: { $first: "$$ROOT" },还将procedures$push逻辑保留为单独的字段。然后,$addFields我将该程序数组移动到 invoice对象中。然后将root替换为那个。

您不应该将用作inprocedureIndex的一部分,因为那时您将无法获得一组, 。如您所见,按照我的逻辑,它工作得很好。_id$groupproceduresinvoiceIndex$group

链接到 mongoplayground


推荐阅读