尝试为我们的网站建立一个主页的模型,我们希望列出最近添加的文档列表,每个类别最多为每个提供商提供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