代码之家  ›  专栏  ›  技术社区  ›  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(...)"}
       ]
      }
     ]
    }
    

    我需要从具有给定联系人的特定用户获取最后两条消息。

    我已经试过几个类似的:

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

    双份的 $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'}}
    ])