1

画像をアップロードすると、アップロードされた画像がサムネイルに並べて表示されるアプリケーションに取り組んでいます。フィルターの可能性を実装して、たとえば降順で最初に最も多くのポイントを持つ画像のように、画像を別の順序で表示できるようにしたいと考えています。

これをどのように行うべきかについての良い解決策を思いつくのに苦労しています.私が考えることができる唯一のことは、これのための新しいルートを作成することです(私が現在使用しているものと同じです, 以下), しかし別の並べ替え。

ただし、これは DRY コーディングであり、さらに多くの並べ替えオプションを計画しているため、特に良いことではありません。

これに関して 2 つの質問があります。

  1. これを達成するためのより良い方法はありますか (ルートを呼び出す必要がなく、代わりにクライアント側で実行するためのソリューションですか? または、ルートにパラメーターを渡し、if ステートメントを使用してソート方法を決定することもできます) ?
  2. サーバー側で並べ替えを行う必要がある場合、ポイントでこれを行うにはどうすればよいですか? ポイントの量は計算され (賛成票 - 反対票)、スキーマに直接保存されません。

画像のモデル:

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 に答える