在数组聚合MongoDB中设置索引范围

时间:2018-07-06 13:02:51

标签: arrays mongodb range aggregation

我的数据库如下:

{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 :(得分:0)

$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/