我有mongo这样的收藏,
[{
id: 1,
"liked": false,
"opened": 2022-10-01T00:00:00.000+00:00
},
{
id: 2,
"liked": true,
"opened": 2022-10-02T00:00:00.000+00:00
},
{
id: 3,
"liked": false,
"opened": 2022-08-03T00:00:00.000+00:00
},
{
id: 4,
"liked": true,
"opened": 2022-10-04T00:00:00.000+00:00
}]
这里喜欢
是布尔值,打开
是日期时间,我想像下面这样排序
一个样本输出可以是(id 2
[{
id: 2,
"liked": true,
"opened": 2022-10-02T00:00:00.000+00:00
},
{
id: 4,
"liked": true,
"opened": 2022-10-04T00:00:00.000+00:00
},{
id: 1,
"liked": false,
"opened": 2022-10-01T00:00:00.000+00:00
},
{
id: 3,
"liked": false,
"opened": 2022-08-03T00:00:00.000+00:00
}]
我可以像db.集合. find().sort({喜欢:-1,打开:1})
一样排序,然后在我的代码中,我可以通过创建3个组(喜欢=真,打开)来洗牌记录
您可以使用$switch
创建一个辅助字段sortOrder
来控制您的组顺序。然后使用$rand
在组内创建随机排序。
db.collection.aggregate([
{
"$addFields": {
"sortOrder": {
"$switch": {
"branches": [
{
"case": "$liked",
"then": 1
},
{
"case": {
$lt: [
{
"$dateDiff": {
"startDate": "$opened",
"endDate": "$$NOW",
"unit": "day"
}
},
30
]
},
"then": 2
}
],
default: 3
}
},
"rand": {
"$rand": {}
}
}
},
{
$sort: {
sortOrder: 1,
rand: 1
}
}
])
这里是Mongo游乐场供您参考。