Агрегировать в MongoDB в массивах с конкретными записями - PullRequest
0 голосов
/ 05 июля 2018

Моя база данных выглядит так:

{email:"user", contacts: 
 [
  {emailContact:"test", firstName:"test", lastName:"test", messages:
   [
    {email:"user", content:"hi", date:"ISODate(...)"}
    {email:"test", content:"how are you?", date:"ISODate(...)"}
    {email:"user", content:"im fine", date:"ISODate(...)"}
   ]
  },
  {emailContact:test2, firstName:"test2", lastName:"test2", messages:
   [
    {email:"user", content:"hahaha", date:"ISODate(...)"}
    {email:"test2", content:"yea thats right", date:"ISODate(...)"}
    {email:"user", content:"xd", date:"ISODate(...)"}
   ]
  }
 ]
}

Мне нужно получить 2 последних сообщения от конкретного пользователя с данным контактом.

Я уже пробовал несколько похожих:

db.contacts.aggregate([{$match:{email:"user",emailContact:"test"}},{$unwind:{'contacts.messages'}},{$sort:{'contacts.messages.date':1,'contacts.messages.content':1,'contacts.messages.emailContact':1}},{$group:{who:'$email', content:'$content', date:{$last:'$date'}}}])

Спасибо за любую помощь

1 Ответ

0 голосов
/ 05 июля 2018

Двойной $unwind может это сделать.

db.contacts.aggregate([
  {$match: {email: 'user'}},
  {$unwind: '$contacts'},
  {$match: {'contacts.emailContact': 'test'}},
  {$unwind: '$contacts.messages'},
  {$sort: {'contacts.messages.date': -1}},
  {$limit: 2},
  {$replaceRoot: {newRoot: '$contacts.messages'}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...