我的数据库如下:
{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'}}])
谢谢您的帮助
答案 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/