CartmanGui
@CartmanGui

Как отсортировать по полю array object?

Есть модель топика с сообщениями
var schemaMessage = new Schema({
    message: {
        type: String,
        required: true
    },
    from: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    to: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    date_created: {
        type: Date,
        default: Date.now
    }});

var schemaTopic  = new Schema({
    title: {
        type: String,
        required: true
    }
    ,messages: [schemaMessage]   
    ,date_created: {
        type: Date,
        default: Date.now
    }
});


Нужно вывести пользователю список топиков отсортированных по дате последнего сообщения в них для него
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 2
@lega
список топиков отсортированных по дате последнего сообщения в них для него

Для этого в топике нужно хранить дату последнего сообщения.

В теории такой запрос можно сделать на AgregationFramework, но он не будет использовать индексы, а значит будет полный проход по коллекции, а значит будет тормозить когда база вырастет.

Даже если бы вы использовали SQL, такая колонка была бы желательна, и необходима для худшего случая.
Ответ написан
Комментировать
CartmanGui
@CartmanGui Автор вопроса
Для этого в топике нужно хранить дату последнего сообщения.

Дело в том, что нужно для каждого пользователя сортировать топики по сообщению именно для него, а в вашем случаи сортировка будет просто по последнему сообщению не важно для кого.
Пока пришел к беседующему решению
schema.statics.getTopicList = function (userId, offset, callback) {
    var Topic = this;
        ,q = [
        {$unwind: "$messages"},
        {$match: {$or: [{"messages.to": userId}, {"messages.from": userId}]}},
        {$sort: {"messages.date_created": -1}},
        {$group: {
                    _id: "$_id",
                    "title":{$first: "$title"},
                    "date_last_message":{$first: "$messages.date_created"},
                    "date_created":{$first: "$date_created"},
                }
        },
        {$sort: {"date_last_message": -1}},
    ];
    if(offset != undefined) {
        q.push({$skip: (config.get('topic:limit') * offset)});
        q.push({$limit: config.get('topic:limit')});
    }

    this.aggregate(q,function(err, topics) {
        if(err) return callback(err);
        callback(null,topics);
    });

};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы