Mongodb对集合数据进行排序查询

时间:2017-02-08 06:57:34

标签: node.js mongodb sorting mongoose

我正在开发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查询。

1 个答案:

答案 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 
}