当前位置: 首页 > 面试题库 >

如何从Filter Aggregation返回的文档集中将当前聚合上下文缩小到特定范围?

丁经国
2023-03-14
问题内容

我有一个嵌套的对象映射,示例数据:

     {
        "_index": "simpleindex",
        "_type": "games",
        "_id": "AU_eC-Uzt6KxlUliF68N",
        "_score": 1,
        "_source": {
           "continents": [
              {
                 "name": "Asia",
                 "countries": [
                    {
                       "name": "India",
                       "states": [
                          {
                             "name": "TN",
                             "game": "soccor",
                             "wins": 1
                          }
                       ]
                    },
                    {
                       "name": "India",
                       "states": [
                          {
                             "name": "KA",
                             "game": "soccor",
                             "wins": 1
                          }
                       ]
                    }
                 ]
              }
           ]
        }
     },
     {
        "_index": "simpleindex",
        "_type": "games",
        "_id": "AU_eCf5dt6KxlUliF637",
        "_score": 1,
        "_source": {
           "continents": [
              {
                 "name": "Asia",
                 "countries": [
                    {
                       "name": "India",
                       "states": [
                          {
                             "name": "TN",
                             "game": "soccor",
                             "wins": 1
                          }
                       ]
                    }
                 ]
              }
           ]
        }
     },
     {
        "_index": "simpleindex",
        "_type": "games",
        "_id": "AU_eDIdXt6KxlUliF69i",
        "_score": 1,
        "_source": {
           "continents": [
              {
                 "name": "Asia",
                 "countries": [
                    {
                       "name": "India",
                       "states": [
                          {
                             "name": "TN",
                             "game": "soccor",
                             "wins": 1
                          }
                       ]
                    },
                    {
                       "name": "India",
                       "states": [
                          {
                             "name": "KA",
                             "game": "soccor",
                             "wins": 1
                          }
                       ]
                    },
                    {
                       "name": "Pak",
                       "states": [
                          {
                             "name": "NA",
                             "game": "soccor",
                             "wins": 1
                          }
                       ]
                    }
                 ]
              }
           ]
        }
     }

这是我的过滤汇总,可返回与过滤条件匹配的文档(即,大陆应为“亚洲”,国家应为“印度”):

{
"aggs": {
"DocumentSet": {
  "filter": {
    "and": {
      "filters": [
        {
          "nested": {
            "path": "continents",
            "query": {
              "match": {
                "continents.name": "asia"
              }
            }
          }
        },
        {
          "nested": {
            "path": "continents.countries",
            "query": {
              "match": {
                "continents.countries.name": "india"
              }
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "continents": {
      "nested": {
        "path": "continents"
      },
      "aggs": {
        "countries": {
          "nested": {
            "path": "continents.countries"
          },
          "aggs": {
            "states": {
              "nested": {
                "path": "continents.countries.states"
              },
              "aggs": {
                "count": {
                  "value_count": {
                    "field": "continents.countries.states.wins"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}}}

这是结果(副本仅将聚合粘贴到此处):

"aggregations": {
  "DocumentSet": {
     "doc_count": 3,
     "continents": {
         "doc_count": 3,
         "countries": {
            "doc_count": 6,
            "states": {
               "doc_count": 6,
               "count": {
                  "value": 6
               }
            }
         }
      }
   }
}

我的意图是仅从中获得“胜利” continents.name=asia AND countries.name=india。过滤器可以按预期工作,但是我只需要将聚合范围缩小到countries.name=india;
本质上是Filter聚合返回的文档的作用域的另一个级别,因此叶聚合计数为5而不是6。


问题答案:

尝试以下聚合:

{
  "aggs": {
    "continents": {
      "nested": {
        "path": "continents"
      },
      "aggs": {
        "asia_continent": {
          "filter": {
            "query": {
              "match": {
                "continents.name": "asia"
              }
            }
          },
          "aggs": {
            "countries": {
              "nested": {
                "path": "continents.countries"
              },
              "aggs": {
                "india_country": {
                  "filter": {
                    "query": {
                      "match": {
                        "continents.countries.name": "india"
                      }
                    }
                  },
                  "aggs": {
                    "states": {
                      "nested": {
                        "path": "continents.countries.states"
                      },
                      "aggs": {
                        "count": {
                          "value_count": {
                            "field": "continents.countries.states.wins"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}


 类似资料:
  • 我在MonoDB集合中有100k个文档,有20k个文档/记录。我想查找该特定文档使用的内存。 请帮助我在MongoDB控制台中查找内存大小(MB)。

  • 问题内容: 我有这些猫鼬模式: 如何返回所有带有最新消息子文档(限制1)的线程? 目前,我正在服务器端过滤结果,但出于性能考虑,我想在MongoDb中移动此操作。 问题答案: 您可以使用,,并使用类似以下方式进行操作:

  • 假设我有以下JSON结构,我希望按性别分组,并希望在同一字段中返回多个文档值: 现在我知道我可以做这样的事情,但是我需要把年龄和名字合并到一个字段中。

  • 我试图实现一种在Firestore中保持一致性的方法,但我需要一种找到重复数据存在的所有位置的方法。firestore中是否有方法查找其子集合包含具有特定文档ID的文档的所有文档?例如对于以下结构 我将使用什么查询来查找其“朋友”列表包含文档 ID 为 5678 的文档的所有用户 ID?例如,当用户 5678 决定更改他/她的姓名时?

  • 版本 使用Elasticsearch 目的 此查询将返回直方图,但将返回所有文档中所有可用日期的桶。它不限制在特定的日期范围内。 我试过什么? 我尝试了很多方法来解决这个问题,但都失败了。*范围筛选器,然后直方图*日期范围聚合,然后直方图桶*使用with,完整日期,和时间戳*在直方图聚合内尝试范围筛选器 任何指导将不胜感激!谢了。

  • 这是我的数据库结构。 城市->地标->景点(每一个都是一个集合) 查询 列出特定城市下的所有景点。