【问题标题】:group values by multiple fields按多个字段分组值
【发布时间】:2018-11-28 16:48:48
【问题描述】:

我有这些文件:

{
  "Sigle_1": "BIOS",
  "Sigle_2": "BFTA"
},
{
  "Sigle_1": "BERP",
  "Sigle_2": "BEST"
},
{
  "Sigle_1": "BHDL",
  "Sigle_2": "BIOS"
},
{
  "Sigle_1": "BIPM",
  "Sigle_2": "BEST"
},
{
  "Sigle_1": "BHDL",
  "Sigle_2": "BIOS"
}

我怎样才能发出一个请求,它将连接 Sigle_1 和 Sigle_2 和组值 reslut?

预期结果示例:

{
  "Sigle": "BIOS",
},
{
  "Sigle": "BFTA",
},
{
  "Sigle": "BERP",
},
{
  "Sigle": "BEST",
},
{
  "Sigle": "BHDL",
},
{
  "Sigle": "BIPM",
}

我试过了,但不完整

db.users.aggregate([{$group: {_id: {Sigle1: '$Sigle_1', Sigle2: '$Sigle_2'}}}])

【问题讨论】:

    标签: mongodb aggregation-framework aggregation


    【解决方案1】:

    您需要在这里使用$facet $groupSigle_1Sigle_2 分开,然后使用$concatArrays 合并两个数组,最后使用$group 来区分整个数据

    db.collection.aggregate([
      { "$facet": {
        "array1": [
          { "$group": {
            "_id": "$Sigle_1"
          }}
        ],
        "array2": [
          { "$group": {
            "_id": "$Sigle_2"
          }}
        ]
      }},
      { "$addFields": {
        "data": {
          "$concatArrays": ["$array1", "$array2"]
        }
      }},
      { "$unwind": "$data" },
      { "$replaceRoot": { "newRoot": "$data" }},
      { "$group": {
        "_id": "$_id"
      }},
      { "$project": { "Sigle": "$_id", "_id": 0 }}
    ])
    

    输出

    [
      {
        "Sigle": "BFTA"
      },
      {
        "Sigle": "BEST"
      },
      {
        "Sigle": "BHDL"
      },
      {
        "Sigle": "BERP"
      },
      {
        "Sigle": "BIPM"
      },
      {
        "Sigle": "BIOS"
      }
    ]
    

    你检查一下here

    【讨论】:

      【解决方案2】:

      我可以在单个查询中添加另一个字段!!!

      {
        "Sigle_1": "BIOS",
        "Sigle_2": "BFTA",
        "Name_1": "Basic Input Output System",
        "Name_2": "Belgian Food Truck Association"
      
      },
      {
        "Sigle_1": "BERP",
        "Sigle_2": "BEST",
        "Name_1": "British Experimental Rotor Programme",
        "Name_2": "Board of European Students of Technology"
      },
      {
        "Sigle_1": "BHDL",
        "Sigle_2": "BIOS",
        "Name_1": "B Hardware Description Language",
        "Name_2": "Basic Input Output System"
      },
      {
        "Sigle_1": "BIPM",
        "Sigle_2": "BEST",
        "Name_1": "Brevet d'initiation au parachutisme militaire",
        "Name_2": "Board of European Students of Technology"
      },
      {
        "Sigle_1": "BHDL",
        "Sigle_2": "BIOS",
        "Name_1": "B Hardware Description Language",
        "Name_2": "Basic Input Output System"
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 1970-01-01
        相关资源
        最近更新 更多