2016-07-15 6 views
1

Я реализую функцию поиска, используя Elasticsearch.
Elasticsearch и последующие запросы Mongodb

Я получаю набор «username», возвращенный Elasticsearch, после чего мне нужно запросить коллекцию в MongoDB для получения последнего комментария каждого пользователя в «имени пользователя».

Вопрос: Допустим, я получаю ~ 100 имен пользователей каждый раз, когда я запрашиваю Elasticsearch, какой бы быстрый способ запросить MongoDB, чтобы получить последний комментарий каждого пользователя. Является ли запрос MongoDB 100 раз в цикле for, используя только .findOne()?

(Примечание - Поскольку последний комментарий изменяется пользователем очень часто, я не хочу, чтобы хранить его в Elasticsearch как вызовет получить с изменением переиндексации процесса для всего документа слишком часто)

ответ

3

Этот ответ предполагает следующую схему для вашего Монго БД хранятся в comments дб.

{ 
    "_id" : ObjectId("5788b71180036a1613ac0e34"), 
    "username": "abc", 
    "comment": "Best" 
} 

предполагая usernames список пользователей, вы получите от elasticsearch, вы можете выполнить следующие aggregate:

a =[ 
    {$match: {"username":{'$in':usernames}}}, 
    {$sort:{_id:-1}}, 
    { 
     $group: 
     { 
      _id: "$username", 
      latestcomment: { $first: "$comment" } 
     } 
    } 
] 
db.comments.aggregate(a) 
0

Вы можете попробуйте это.

db.foo.find(). sort ({_ id: 1}). limit (100);

1-сортирует по возрастанию (от старых к новым) и -1 будет сортировать по убыванию (новый старый.)

+0

Приведенный выше запрос не включает в себя имена пользователей, полученные от результатов Elasticsearch в любой форме! – vjjj

Смежные вопросы