MongoDB计算最常见的嵌套数组

时间:2018-02-11 11:42:36

标签: arrays mongodb mongodb-query aggregation-framework

我有诗集。集合中的文档具有以下结构:

says

我需要找到scene对象中包含最多对话框($group)的诗。 我尝试过使用$unwind$sort_locationManager.GetBestProvider(new Criteria() { Accuracy = Accuracy.Coarse}, true); 等,但结果并不正确。

2 个答案:

答案 0 :(得分:1)

你可以尝试下面的聚合,我们是扁平化行为,然后是场景,然后是行动,最后说要获得对话的总数,$sort按总数计算诗歌

db.poems.aggregate(
    [
        {$addFields : {flatActs : {$reduce : {input : "$acts", initialValue : [], in : {$concatArrays : ["$$value", ["$$this"]]}}}}},
        {$addFields : {flatScenes : {$reduce : {input : "$flatActs.scenes", initialValue : [], in : {$concatArrays : ["$$value", "$$this"]}}}}},
        {$addFields : {flatAction : {$reduce : {input : "$flatScenes.action", initialValue : [], in : {$concatArrays : ["$$value", "$$this"]}}}}},
        {$addFields : {flatSays : {$reduce : {input : "$flatAction.says", initialValue : [], in : {$concatArrays : ["$$value", "$$this"]}}}}},
        {$addFields : {dialogCount : {$size : "$flatSays"}}},
        {$sort : {dialogCount : -1}},
        {$project : {flatActs : 0, flatScenes : 0, flatAction : 0, flatSays : 0}}
    ]
).pretty()

答案 1 :(得分:1)

  

我需要找到具有最多对话(说)的诗   场景对象

这可以通过以下方式解释。

  

统计所有场景中所有动作的所有动作对每首诗和节目中的所有动作都是如此   最大的诗歌文件说   所有诗歌。

我们的想法是在所有动作,所有场景和所有动作中找到最大值,并以最大值表示输出诗歌文件。

嵌套$map$max组合可输出不同级别的最大值。

$project排除“maxsaysacrossallacts”字段。

这样的东西
 db.poems.aggregate([
  {"$addFields":{
    "maxsaysacrossallacts":{
      "$max":{
        "$map":{
          "input":"$acts",
          "as":"maxsaysineachact",
          "in":{
            "$max":{
              "$map":{
                "input":"$$maxsaysineachact.scenes",
                "as":"maxsaysineachscene",
                "in":{
                  "$max":{
                    "$map":{
                      "input":"$$maxsaysineachscene.action",
                      "as":"sayssceneineachaction",
                      "in":{"$size":"$$sayssceneineachaction.says"}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }},
  {"$sort":{"maxsaysacrossallacts":-1}},
  {"$limit":1},
  {"$project":{"maxsaysacrossallacts":0}}
])

更新:根据以下评论,如果您需要输出max say poem文档,则可以使用以下聚合查询。

统计所有行为中的所有说法并输出最大说数的诗。

db.poems.aggregate([
  {"$addFields":{
    "sumsaysacrossallacts":{
      "$sum":{
        "$map":{
          "input":"$acts",
          "as":"sumsaysineachact",
          "in":{
            "$sum":{
              "$map":{
                "input":"$$sumsaysineachact.scenes",
                "as":"sumsaysineachscene",
                "in":{
                  "$sum":{
                    "$map":{
                      "input":"$$sumsaysineachscene.action",
                      "as":"sayssceneineachaction",
                      "in":{"$size":"$$sayssceneineachaction.says"}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }},
  {"$sort":{"sumsaysacrossallacts":-1}},
  {"$limit":1},
  {"$project":{"sumsaysacrossallacts":0}}
])