如何解决查询返回具有特定日期范围编号的文档,然后对它们进行排序然后排序
我有一个 Song
架构,如下所示:
const songSchema = new mongoose.Schema({
name: {
type: String,required: true,},URL: {
type: String,playedOn: [mongoose.Schema.Types.Date],});
在数据库中我有如下值:
{
"_id" : ObjectId("6013e57d909d5252e869eac0"),"playedOn" : [
ISODate("2021-01-29T10:41:55.444Z"),ISODate("2021-01-29T10:41:55.447Z"),ISODate("2021-01-29T10:41:55.448Z"),ISODate("2021-01-29T10:41:55.450Z"),ISODate("2021-01-29T10:41:55.451Z"),ISODate("2021-01-29T10:41:55.452Z")
],"name" : "Ariana Grande - Positions","URL" : "https://firebasestorage.googleapis.com/v0/b/reactnativeauth-sj.appspot.com/o/003.%20Ariana%20Grande%20-%20positions.mp3?alt=media&token=d206e095-6360-46c4-ad1e-40a9204ca9d0","__v" : 1
}
{
"_id" : ObjectId("6013e57d909d5252e869eac1"),"playedOn" : [
ISODate("2021-01-29T10:41:53.708Z")
],"name" : "Dua Lipa - Break My Heart","URL" : "https://firebasestorage.googleapis.com/v0/b/reactnativeauth-sj.appspot.com/o/005.%20Dua%20Lipa%20-%20Break%20My%20Heart.mp3?alt=media&token=7feea778-761c-4e0e-8840-6f60e7795651","__v" : 1
}
我想先把最近7天播放次数最多的歌曲(比如前10)按播放次数降序排列,结果如下:
{name: 'Positions',_id: '39s39s',numberOfPlays: 9}
{name: 'Irresistible',numberOfPlays: 5}
{name: 'Closer',numberOfPlays: 3}
我尝试过以下方法:
db.songs.find({playedOn: {elemMatch: {$lt: ISODate()}}},{_id: 1,playedOn: 1,name: 1}).pretty();
db.songs.find({playedOn: {$lt: ISODate(),$gte: ISODate("2021-01-28T09:20:37.732Z")}},name: 1}).pretty();
还有很多不同的东西,但我就是不知道我应该为相同的东西写什么查询。我也曾尝试使用 aggregate
,但徒劳无功。请给出如何完成的方向。
解决方法
使用 aggregate()
,
-
$match
在$elemMatch
中的开始日期和结束日期 -
$filter
从数组中获取过滤日期 -
$size
从$filter
获取返回元素的大小 -
$sort
按numberOfPlays
降序排列 -
$limit
返回 10 个文档
// start date and end date set your logic as per your requirement
let endDate = new Date();
let startDate = new Date(endDate);
startDate.setDate(startDate.getDate() - 7);
db.songs.aggregate([
{
$match: {
playedOn: {
$elemMatch: {
$gte: startDate,$lt: endDate
}
}
}
},{
$project: {
name: 1,numberOfPlays: {
$size: {
$filter: {
input: "$playedOn",cond: {
$and: [
{ $gte: ["$$this",startDate] },{ $lt: ["$$this",endDate] }
]
}
}
}
}
}
},{ $sort: { numberOfPlays: -1 } },{ $limit: 10 }
])
使用 find()
从 MongoDB v4.4 开始,作为使投影与聚合的 $project
阶段保持一致的一部分,
- 对于限制和排序,请尝试
.sort("-numberOfPlays").limit(10)
查询结束
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。