javascript - Mongodb在数组中排序
问题描述
有没有办法按给定的数组排序?
像这样的东西:
const somes = await SomeModel.find({}).sort({'_id': {'$in': [ObjectId('sdasdsd), ObjectId('sdasdsd), ObjectId('sdasdsd)]}}).exec()
我正在寻找一种获得解决方案的方法,以获取集合的所有文档并按文档的 _id 是否与给定数组之一匹配进行排序。
一个例子:
我们有专辑收藏和歌曲收藏。在专辑集合中,我们存储属于专辑的歌曲的 ID。
我想获取歌曲,但如果歌曲在专辑中,请将它们放在数组的前面。
我解决了这个如下,但它看起来有点hacky:
const songs = await SongMode.find({}).skipe(limit * page).limit(limit).exec();
const album = await AlbumModel.findById(id).exec();
if(album) {
songArr = album.songs.slice(limit * page);
for(let song of album.songs) {
songs.unshift(song);
songs.pop();
}
}
解决方案
这不能使用普通的.find().sort()
. 相反,您将需要使用 MongoDB 聚合管道 ( .aggregate()
)。具体来说,您需要执行以下操作:
- 执行一个
$project
离子,如果_id
是$in
数组,则新sort_field
的值为1
,否则为0
。 - 执行一个
$sort
这样的命令,你正在对 new 进行降序排序sort_field
。
如果您使用的是 MongoDB 3.4 或更高版本,那么这很容易,因为有以下$addFields
运算符:
const your_array_of_ids = [
ObjectId('objectid1'),
ObjectId('objectid2'),
ObjectId('objectid3')
];
SomeModel.aggregate([
{ '$addFields': {
'sort_field': { '$cond': {
'if': { '$in': [ '$_id', your_array_of_ids ] },
'then': 1,
'else': 0
}}
}},
{ '$sort': {
'sort_field': -1
}}
]);
如果您使用的是旧版本的 MongoDB,则解决方案类似,但$addFields
您将使用$project
. 此外,您将需要明确包含您想要包含的所有其他字段,否则它们将被排除在结果之外。
推荐阅读
- javascript - 在 Formik 组件中使用 react-datetime 保存数据的问题
- json - 将 github json 数据格式化为带有每日日期的 pandas 数据框
- web-services - BIZTALK 上简单代理的最佳方法
- flutter - 使用颤振 firebase_messaging 插件发送通知声音
- ios - iOS 9 应用程序操作系统的 Itune 连接警告-
- pentaho - Pentaho 连接数据库出错
- .net - 有什么方法可以检查所有代理是否都在 Kafka 中启动并运行?
- codeigniter - 如何在非活动 24 小时后注销 codeigniter 应用程序?
- asp.net-mvc - 这是可以在 asp.net / IIS Express 中下载所有文件的正常行为吗?
- ios - Pod 文件断点在 xcode 10.1 中不起作用,而在旧版本的 xcode 中起作用