代码之家  ›  专栏  ›  技术社区  ›  Kubatekk

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

  •  0
  • Kubatekk  · 技术社区  · 6 年前

    我的数据库看起来像:

    {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 回复  |  直到 6 年前
        1
  •  0
  •   cornacchia    6 年前

    $skip $limit 是你的朋友。

    假设你必须从4到6收到信息,你会 $跳过 前三份文件 $限额 获取所需文档数的结果(在本例中也是三个,因为您需要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/