у меня есть некоторые коллекции MongoDB:агрегации Elasticsearch несколькими индексами
Истории:
{
title: { type: String },
text: { type: String }
}
Комментарии:
{
text: { type: String },
story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" }
}
Likes:
{
story: { type: mongoose.Schema.Types.ObjectId, ref: "Stories" }
}
Это коллекции индексируются Elasticsearch. Поэтому мне нужно фильтровать Истории в Elasticsearch по комментариям и комментариям.
Примеры данных.
Stories:
{
"title": "First story",
"text": "This must be the MOST popular story..."
}
{
"title": "Second story",
"text": "This story is popular too, but not as the first story."
}
{
"title": "Third story",
"text": "This is a unpopular story, because dont have any comment or like"
}
Comments:
{
"title": "Foo",
"story": ObjectId("First Story ID")
}
{
"title": "Foobar",
"story": ObjectId("First Story ID")
}
{
"title": "Bar",
"story": ObjectId("Second Story ID")
}
Likes:
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("First Story ID") }
{ "story": ObjectId("Second Story ID") }
{ "story": ObjectId("Second Story ID") }
{ "story": ObjectId("Third Story ID") }
В результате фильтрации должно быть так:
- Первая история (4 Понравилось, 2 комментариев)
- Вторая история (2 Понравилось 1 комментарий)
- Третья история (1 like)
Действительно ли это сделать с помощью Elasticsearch? И как я могу это сделать?
PS. Почему я решил не фильтровать с Монго? Потому что Mongo показывает очень медленный результат такой агрегации.
PPS. Монгольский код агрегации для этой задачи:
db.getCollection('stories').aggregate([
{$lookup:{from:"comments",localField:"_id", foreignField:"story", as:"comments"}},
{$lookup:{from:"likes",localField:"_id", foreignField:"story", as:"likes"}},
{$project: { title: 1, text: 1,comments:1,likes:1, count: { $add: [ {$size: "$comments"}, {$size: "$likes"} ] } } },
{$sort:{"count":-1}}
])