我正在开发MEAN堆栈应用程序涉及多种类型的媒体(例如照片,视频,Web内容快照)和文本。
我需要通过在特定字段上应用排序查询来按特定顺序对集合进行排序。
排序顺序:
- 0:Text, 1:Photo, 2:Video, 3:Web-content-snapshot
- 1:Photo, 2:Video, 3:Web-content-snapshot, 0:Text
- 2:Video, 1:Photo, 3:Web-content-snapshot, 0:Text
- 3:Web-content-snapshot, 2:Video, 1: Photo, 0:Text
收集:
var mediaSchema = new Schema({
user_id: {type: Schema.Types.ObjectId,ref: 'User'},
// media description
description: {type: String},
// Media type: 1: image, 2: video, 3: Web content snapshot, 0: Text
media_type: {type: Number,default: 0,index: true},
media_name: {type: String},
snapshot_url: {type: String},
snapshot_content: {type: String},
Text: {type: String}
},
{collection: 'media'});
请指导我如何在media_type上应用排序查询,以便我可以按上述排序顺序获取媒体。我正在使用mongoose模块进行mongodb查询。
答案 0 :(得分:1)
如果您只想按media_type
订购(asc / desc),可以使用cursor.sort()
:
# MongoDB native
db.media.find().sort({media_type: 1}) # or -1
# Mongoose way
MediaModel.find().sort({media_type: 1}).exec() # or -1
但是如果你想应用一个自定义/复杂的排序标准,在mongodb你必须在客户端(或服务器端与eval())。
因为cursor.sort()
(以及不推荐使用的$orderby
管道运算符)只接受文档对象作为参数。
# MongoDB shell native
db.media.find().toArray().sort(customCompare);
# Mongoose way
MediaModel.find().exec()
.then(medias => medias.sort(customCompare))
.then(sortedMedias => console.log(sortedMedias));
# Compare function should return <=-1 | 0 | >=1
function customCompare(media1, media2) {
return media1.media_type - media2.media_type
}