Установить диапазон индексов в агрегации массивов MongoDB - PullRequest
0 голосов
/ 06 июля 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(...)"}
   ]
  }
 ]
}

И мне нужно получать сообщения с определенными индексами.Например, сообщения с индексом 4,5,6.

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

db.contacts.aggregation([{$match:{email:"elo@elo.pl"}},{$unwind:'$contacts'},{$match:{'contacts.emailContact':'user@user.pl'}},{$unwind:'$contacts.messages'},{$project:{email:1,content:1,date:{$slice:['$contacts.messages',4,6]}}},{$replaceRoot:{newRoot:'$contacts.messages'}}])

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

1 Ответ

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

$skip и $limit ваши друзья.

Допустим, вы должны получать сообщения от 4 до 6, вам нужно $skip первые три документа и $limit ваш результат, чтобы получить числодокументов, которые вы хотите (в данном случае также три, потому что вы хотите 4, 5, 6):

db.contacts.aggregate([
  {$match: {email: 'user'}},
  {$unwind: '$contacts'},
  {$match: {'contacts.emailContact': 'test'}},
  {$unwind: '$contacts.messages'},
  {$sort: {'contacts.messages.date': -1}},
  {$skip: 3},
  {$limit: 3},
  {$replaceRoot: {newRoot: '$contacts.messages'}}
])

Я предлагаю вам в любом случае проверить документацию по агрегатам, она хорошо написана и полна примеров: https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

...