MongoDB从每个类别的每个提供商中选择2个最新文档

时间:2015-06-11 20:20:55

标签: mongodb aggregation-framework

尝试为我们的网站建立一个主页的模型,我们希望列出最近添加的文档列表,每个类别最多为每个提供商提供2个文档。 换句话说,我们不想过度展示个人提供者或个人类别。

我们有以下doc结构:

事件:

{
 created_at: isodate(),
 start_date: isodate(),
 title: "document 1 title health related electronic device",
 categories: [
         {"id": 1, "title": "health"},
         {"id": 2, "title": "electronics"}],
 provider: { "id": 555, "name": "PAMF"}
 }
},
{
 created_at: isodate(),
 start_date: isodate(),
 title: "document 2 title electronics iphone",
 categories: [
         {"id": 5, "title": "phone"},
         {"id": 2, "title": "electronics"},
         {"id": 9, "title": "accessory"},
         {"id": 15, "title": "mobile"}],
 provider: { "id": 555, "name": "Apple Store"}
 }
}

......等等。

有没有办法在MONGODB中编写查询,从每个类别中的每个提供商中选择2个文档?

为了比较起见,我们目前在弹性搜索中这样做:

{
  "size": 0,
  "aggs": {
    "level-1": {
      "terms": {
        "field": "provider.name",
        "size": 0
      },
      "aggs": {
        "level-2": {
          "terms": {
            "field": "categories.id",
            "size": 0,
            "order": {
              "_term": "asc"
            }
          },
          "aggs": {
            "top-hits-docs": {
              "top_hits": {
                "size": 2,
                "sort": [
                  {
                    "start_date": "desc"
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}

正如所指出的,我忘了包含所需的输出,但主要是因为输出并不重要。这不是一个面向作业的实时用户,它将在一天内多次重新排序主页列表。 只要所需的数据集存在,封闭的顶级元素就不重要了。因此,使用几个示例事件将每个主机内的每个主机包装起来的方法之一,例如:

category_id.1
   provider1
      doc5
      doc1
   provider3
      doc8
      doc6
category_id.2
   provider2
      doc45
      doc15
   provider3
      doc153
      doc66

也可以是相反的顺序,其中所有内容都包含在提供者内部,即:

provider1
  category_id.1
      doc599
      doc15
  category_id.2
      doc81
      doc67
provider1
  category_id.1
      doc57
      doc14
   category_id.6
      doc86
      doc64

0 个答案:

没有答案