【问题标题】:Avoiding Empty Curly Braces in MongoDB Aggregation避免 MongoDB 聚合中的空花括号
【发布时间】:2021-12-18 08:44:49
【问题描述】:

我正在尝试通过 react chartjs 显示 mongodb 聚合结果。我的部分问题是我没有在后端实现正确的聚合输出。

当前聚合输出,其中包含不需要的空花括号

[{
  "_id":"Fubar",
  "A_set":[{"A":"Y"},{"A":"N"},{},{}],
  "A_count_set":[{"A_count":1},{"A_count":1},{},{}],
  "B_set":[{},{},{"B":"N"},{"B":"Y"}],
  "B_count_set":[{},{},{"B_count":1},{"B_count":1}]},
{
"_id":"Fubar2",
  "A_set":[{"A":"Y"},{"A":"N"},{},{}],
  "A_count_set":[{"A_count":1},{"A_count":1},{},{}],
  "B_set":[{},{},{"B":"N"},{"B":"Y"}],
  "B_count_set":[{},{},{"B_count":1},{"B_count":1}]
}]

我正在尝试实现缺少空花括号的 目标聚合输出

[{
  "_id":"Fubar",
  "A_set":[{"A":"Y"},{"A":"N"}],
  "A_count_set":[{"A_count":1},{"A_count":1}],
  "B_set":[{"B":"N"},{"B":"Y"}],
  "B_count_set":[{"B_count":1},{"B_count":1}]},
{
"_id":"Fubar2",
  "A_set":[{"A":"Y"},{"A":"N"}],
  "A_count_set":[{"A_count":1},{"A_count":1}],
  "B_set":[{"B":"N"},{"B":"Y"}],
  "B_count_set":[{"B_count":1},{"B_count":1}]
}]

管道操作

{$facet: {
      A_branch: [
        {$group: {
          _id: {
            Q_id: "$A_id",
            A_id: "$A_id"
          },
          A_count: {$sum: 1}
        }}
      ],
      B_branch: [
        {$group: {
          _id: {
            Q_id: "$Q_id",
            B_id: "$B_id"
          },
          B_count: {$sum: 1}
        }}
      ]
    }},
    {$project: {
      combined_group: {$setUnion: ['$A_branch','$B_branch']}
    }},
    {$unwind: '$combined_group'},
    {$lookup:
      {
        from: "Q",
        localField: "combined_group._id.Q_id",
        foreignField: "_id",
        as: "QRef" 
      }
    },
    {$unwind: "$QRef" },
    {$lookup:
      {
        from: "A",
        localField: "combined_group._id.A_id",
        foreignField: "_id",
        as: "ARef" 
      }
    },
    {$unwind: {path:"$ARef", preserveNullAndEmptyArrays: true} },
    {$lookup:
      {
        from: "B",
        localField: "combined_group._id.B_id",
        foreignField: "_id",
        as: "BRef" 
      }
    },
    {$unwind: {path:"$BRef", preserveNullAndEmptyArrays: true} },
    {$group: {
      _id: "$QRef.text",
      A_set: {
        $push: {
          A: "$ARef.value"
        }
      },
      A_count_set: {
        $push: {
          A_count: "$combined_group.A_count"
        }
      },
      B_set: {
        $push: {
          B: "$BRef.value"
        }
      },
      B_count_set: {
        $push: {
          B_count: "$combined_group.B_count"
        }
      }
    }}

聚合输入

{
        "_id" : ObjectId("618..."),
        "Q_id" : ObjectId("618..."),
        "B_id" : ObjectId("618..."),
        "A_id" : ObjectId("618...")
}
{
        "_id" : ObjectId("618..."),
        "Q_id" : ObjectId("618..."),
        "B_id" : ObjectId("618..."),
        "A_id" : ObjectId("618...")
}
{
        "_id" : ObjectId("618..."),
        "Q_id" : ObjectId("618..."),
        "B_id" : ObjectId("618..."),
        "A_id" : ObjectId("618...")
}
{
        "_id" : ObjectId("618..."),
        "Q_id" : ObjectId("618..."),
        "B_id" : ObjectId("618..."),
        "A_id" : ObjectId("618...")
}

【问题讨论】:

    标签: node.js reactjs mongodb chart.js aggregation


    【解决方案1】:

    在管道末尾使用$filter

    db.collection.aggregate([
      {
        "$set": {
          "A_set": {
            "$filter": {
              "input": "$A_set",
              "as": "x",
              "cond": { "$ne": [ "$$x", {}] }
            }
          }
        }
      },
      {
        "$set": {
          "A_count_set": {
            "$filter": {
              "input": "$A_count_set",
              "as": "x",
              "cond": { "$ne": [ "$$x", {}] }
            }
          }
        }
      },
      {
        "$set": {
          "B_set": {
            "$filter": {
              "input": "$B_set",
              "as": "x",
              "cond": { "$ne": [ "$$x", {}] }
            }
          }
        }
      },
      {
        "$set": {
          "B_count_set": {
            "$filter": {
              "input": "$B_count_set",
              "as": "x",
              "cond": { "$ne": [ "$$x", {}] }
            }
          }
        }
      }
    ])
    

    mongoplayground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2017-01-31
      • 2019-01-26
      • 2018-07-24
      • 2010-12-04
      • 2017-12-26
      • 2021-06-21
      相关资源
      最近更新 更多