mongoose mongodb $lookup操作符基于键名

u0sqgete  于 2023-03-30  发布在  Go
关注(0)|答案(1)|浏览(131)

有两个集合tablestable_rows如下:

tables = {
  "_id": "641ce65852a7ccd2f4a7b298",
  "name": "table name",
  "description": "table description",
  "columns": [{
    "_id": "641ce65852a7ccd2f4a7b299",
    "name": "column 1",
    "dataType": "String"
  }, {
    "_id": "641cf95543a5f258bfaf69e3",
    "name": "column 2",
    "dataType": "Number"
  }]
}

table_rows = {
  "tableId": "641ce65852a7ccd2f4a7b298",
  "641ce65852a7ccd2f4a7b299": "Example string",
  "641cf95543a5f258bfaf69e3": 101
}

简而言之,它表示2列1行的常规表格数据,如下所示:
| 栏1|第2栏|
| --------------|--------------|
| 示例字符串|一百零一|
有没有什么方法可以使用$lookup操作符来连接这两个集合,基于tables collection中columns数组的_idtable_rows集合的key name?我尝试的是以某种方式连接列定义(名称,数据类型等)沿着单元格值。
正如您所看到的,card_rows集合中的实际键名是列本身的_id
理想情况下,这将是一个集合,但这些表可以增长到数百列和10 K行,因此它被建模为两个集合,以避免在mongo中未绑定数组。

rn0zuynd

rn0zuynd1#

一个选项是从table_rows开始:

  1. $match的相关文档使用tableId$unwind的“行”和$group的“列”
    1.使用$lookup和pipeline获取每个列文档的列名
    1.格式
db.table_rows.aggregate([
  {$match: {tableId: tableId}},
  {$unset: ["tableId", "_id"]},
  {$project: {rows: {$objectToArray: "$$ROOT"}}},
  {$unwind: "$rows"},
  {$group: {_id: "$rows.k", values: {$push: "$rows.v"}}},
  {$lookup: {
      from: "tables",
      let: {tableId: tableId, colId: "$_id"},
      pipeline: [
        {$match: {$expr: {$eq: ["$_id", "$$tableId"]}}},
        {$project: {
            _id: 0,
            coldata: {
              $first: {$filter: {
                  input: "$columns",
                  cond: {$eq: ["$$colId", "$$this._id"]}
              }}
            }
        }}
      ],
      as: "colName"
  }},
  {$project: {
      colName: {$first: "$colName.coldata.name"},
      values: 1,
      _id: 0
  }}
])

了解它在playground example上的工作原理

  • 如果你想在查询中避免无界数组,你可以删除$group步骤...

相关问题