【问题标题】:Mongodb - group by same value in different fields in different documentsMongodb - 在不同文档的不同字段中按相同值分组
【发布时间】:2021-02-16 21:36:07
【问题描述】:

我希望按该值对不同字段中具有共同值的文档进行分组。简化的记录是:

{ _id:1,
  "Home" : "A",
  "Away" : "B" }

{ _id:2,
  "Home" : "B",
  "Away" : "C" }

{ _id:3,
  "Home" : "C",
  "Away" : "A" }

{ _id:4,
  "Home" : "C",
  "Away" : "B" }

{ _id:5,
  "Home" : "A",
  "Away" : "C" }

我正在尝试获取一个聚合组结果,例如,该结果包括值“A”,无论它是出现在“主页”字段还是“离开”字段的文档中。我想要的结果是:

{"_id": "A", "count": 3},
{"_id": "B", "count": 3},
{"_id": "C", "count": 4}

按“Home”或“Away”分组没有问题,但这不会给我所有记录,如下所示,我不会得到“A”或“B”或“ C”在“主页”字段中:

{$group: 
        {_id: "$Away"} etc... }

我已尝试在此处使用其他帖子中的 $cond,如下所示:

$group : {
    _id : {
        $cond : [{
            $gt : [ "$Away", null]
        }, "$Home"]
    }
}

还尝试了 $or ,这显然是错误的,因为它只会在每个文档中为 Away 和 Home 字段找到相同的值(从未如此):

$group : {
    _id : {
        $or : [ "$Away", "$Home"]
    }
}

我被困住了,不确定这是否可能;对可能位于不同文档的不同字段中的值进行分组。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您可以创建一个对象以使用$objectToArray$unwind,然后像这样分组:

    • 使用$set 和相同的值($Home$Away)创建对象
    • 使用项目不将这些值传递到下一阶段。没有必要,你有目标。
    • 然后$objectToArray 执行$unwind 并获取每个值
    • 最后$groupv 生成,由$objectToArray 生成。
    db.collection.aggregate([
      {
        "$set": {
          "obj": {
            "Home": "$Home",
            "Away": "$Away"
          }
        }
      },
      {
        "$project": {"Away": 0,"Home": 0}
      },
      {
        "$set": {"obj": {"$objectToArray": "$obj"}}
      },
      {
        "$unwind": "$obj"
      },
      {
        "$group": {
          "_id": "$obj.v",
          "count": {"$sum": 1}
        }
      }
    ])
    

    例如here

    【讨论】:

    • 哇!谢谢!我没想到会这么快得到回复,但你的答案是完美的,即使我在我的问题中做了简化,我也能够在更复杂的查询中实现它(包括 $match、$sort 甚至 $addFields . 非常感谢@J.F.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多