在Mongoose模型中对元进行sorting

我正在处理上传图片的应用程序,并且上传的图片以缩略图并排显示。 我想要实现filter的可能性,以便可以以不同的顺序显示图像,例如,大多数点的图像以降序排列。

我有麻烦想出一个很好的解决scheme,应该怎么做,我能想到的唯一的事情就是为此创build一个新的路线(就像我现在使用的路线一样),但是不同的sorting。

这是DRY编码,而不是一件好事,特别是因为我有更多的sorting选项的计划。

我有两个问题:

  1. 有没有更好的方法来完成这个(一个解决scheme,以便我不需要调用一个路由,而是在客户端做呢,或者可能传递一个参数到路由和if语句决定如何sorting) ?
  2. 如果应该在服务器端进行sorting,我怎样才能做到这一点? 计算点数(upvotes – downvotes),并不直接存储在Schema中。

图像模型:

var ImageSchema = new Schema({ name : String, size : Number, title : String, body : String, buf : Buffer, date: { type: Date, default: Date.now }, comments : [CommentSchema], meta : { upvotes : Number, downvotes : Number, favs : Number, uniqueIPs : [String], tags : [String] } }); 

渲染图像的路线:

 app.get('/images/:num?', function(req, res){ var query = model.ImagePost.find({}); query.where('date').lte(new Date()); query.desc('date'); query.exec(function (err, images) { if (err) { console.log(err); // do something } var query = tagModel.Tag.find({}); query.exec(function (err, tags) { if (err) { console.log(err); // do something } query = albumModel.Album.find({}); query.exec(function (err, albums) { if (err) { console.log(err); // do something } res.render('blogs/index', { title: 'Images', imageList: images, tagList: tags, albumList: albums, dateFormatter: dateFormatter }); }); }); }); }); 

Jade文件(部分)将图像呈现给客户端:

 #image div.post input(type='hidden', value=image.name + ',' + image.body + ',' + image.date); button.imageValue(value= image.name, name= image._id) div.albumImgChooseCover + img.images(src='../images/' + image.name) div.postDesc a#single_1(href='../images/' + image.name, title= image.body + ' (Published: '+ formatter.format(image.date) +')') img.zoom(src='../img/zoom.png') a.various#box1(data-fancybox-type='iframe', href='/image/' + image._id.toHexString()) img.comments(src='../img/comments.png') p.nrOfComments= image.comments.length h2.subtitle= image.title p.postDescContent= 'Points' + ': ' + (image.meta.upvotes - blog.meta.downvotes) form.deleteButtonBox(action='/image/delete/' + image._id.toHexString(), method='POST') input(class='deleteButton', type='submit', value='x') a.various#box2(data-fancybox-type='iframe', href='/image/edit/' + blog._id.toHexString()) Edit - if (image.meta.tags) ul.tags h3 Tags: each tag in tagList - if (image.meta.tags.indexOf(tag._id) != -1) a(href='/tag/' + tag._id.toHexString()) span.tagInImage= tag.name 

sort=<value>参数添加到现有路由URL是处理此问题的典型方法。

至于按点sorting,现在Mongo 2.2可用,您可以使用聚合框架:

 ImageSchema.aggregate([ {$project: { name: 1, size: 1, // ... more fields you want included points: {$subtract: {['$meta.upvotes', '$meta.downvotes']}} }}, {$sort: {points: -1}} ], function(err, results) { console.log(results); });