1

我正在开发一个应用程序,您可以在其中上传图像,并且上传的图像在缩略图中并排显示。我想实现过滤器的可能性,以便可以以不同的顺序显示图像,例如,具有最多点的图像按降序排列。

我很难想出一个很好的解决方案来解决这个问题,我唯一能想到的就是为此创建一条新路线(与我现在使用的路线相同,如下所示),但是不同的排序。

然而,这是 DRY 编码,并不是一件好事,尤其是因为我计划提供更多的排序选项。

我对此有两个问题:

  1. 有没有更好的方法来实现这一点(一种解决方案,这样我就不需要调用路由,而是在客户端执行它?或者可能将参数传递给路由并使用 if 语句决定如何排序) ?
  2. 如果应该在服务器端进行排序,我该如何处理积分?点数是计算出来的(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
4

1 回答 1

1

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

至于按点排序,现在 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);
});
于 2012-11-25T03:35:55.807 回答