【问题标题】:Sorting on meta in Mongoose model猫鼬模型中的元排序
【发布时间】:2012-05-07 13:34:21
【问题描述】:

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

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

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

对此我有两个问题:

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

【问题讨论】:

    标签: node.js sorting routes mongoose


    【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 2020-11-21
      • 1970-01-01
      • 2019-05-04
      • 2015-09-16
      • 2017-10-05
      • 1970-01-01
      • 2011-05-17
      • 2017-04-26
      相关资源
      最近更新 更多