代码之家  ›  专栏  ›  技术社区  ›  Mhmd

如何将阵列推入聚合管道并将其提升一级?

  •  1
  • Mhmd  · 技术社区  · 7 年前

    我是MongoDB的新手,我正在开发一个由C#和MongoDB开发的软件。我的数据结构是这样的

    {
      "Id": 1,
      "Title": "myTitle",
      "Geners": [ "Drama", "Action" ],
      "Category": 1,
      "Casts": [
        {
          "Id": 1,
          "Name": "myName",
          "Gender": "Male",
          "Age": 35
        },
        {
          "Id": 2,
          "Name": "herName",
          "Gender": "Female",
          "Age": 30
        },
        {
          "Id": 3,
          "Name": "hisName",
          "Gender": "Male",
          "Age": 45
        }
      ]
    }
    

    这只是一份文件,我有大约500万份文件。我想运行下面这样的查询,根据 Category 并向我展示了我在每个类别中有多少部电影,我想在结果中加入演员阵容。

    db.getCollection('myCollection').aggregate([
        {
        $group:{"_id":"$Category", "count": {$sum:1},
        "Casts":{$push:"$Casts"}} 
        }
    ])
    

    这接近我想要的东西,但问题是 Casts 第二级数组中的数据 {"Id":1, ... , "Casts":[[{},{},...]]} 但我需要这样 {"Id":1, ... , "Casts":[{},{},...]} 我怎样才能这样显示数据?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Danielle Summers    7 年前

    如果可以接受重复项,则以下聚合就足够了:

    db.getCollection('myCollection').aggregate([
        { $unwind:"$Casts"},
        {
        $group:{"_id":"$Category", "count": {$sum:1},
        "Casts":{$push:"$Casts"}} 
        }
    ])
    

    更新时间: 因为你需要有效的计数,所以还有几圈要跳过。

    db.getCollection('myCollection').aggregate([
        { $group:{"_id":"$Category", "count": {$sum:1}, "Casts":{$addToSet:"$Casts"}}},
        {$unwind:"$Casts"},
        {$unwind:"$Casts"},
        { $group:{"_id":"$_id", "count": {$first:"$count"}, "Casts":{$addToSet:"$Casts"}}},
    ])
    

    如果有帮助,请告诉我