2016-05-20 8 views
1

Mongooseからの出力をサブ文書に格納されている日付でソートしようとしています。私はこれがクライアント側でより簡単に行うことができると信じていますが、サーバーリソースの描画を制限し、一度にすべてをロードするのではなく、サブドキュメントをlazyloadしたいと思います。Mongooseでのサブ文書の並べ替え

私はプライベートメッセージング機能に取り組んでいます。私は、会話と呼ばれるスキーマを定義しており、メッセージと呼ばれる別のスキーマが定義されています。コードは次のとおりです。

const mongoose = require('mongoose'); 

const ChatSchema = new mongoose.Schema({ 
    messageBody: { 
     type: String, 
     required: true 
    }, 
    from: { 
     type: String, 
     required: true 
    } 
    }, 
    { 
    timestamps: true // Saves createdAt and updatedAt as dates. createdAt will be our timestamp. 
    }); 

const ConversationSchema = new mongoose.Schema({ 
    participants: [String], 
    messages: [ChatSchema] 
}); 

module.exports = mongoose.model('Chat', ChatSchema); 
module.exports = mongoose.model('Conversation', ConversationSchema); 

メッセージは正常に保存され、情報はデータベースに正しく保存されているようです。最近のメッセージを最初に返すためにcursor.sort()メソッドを使用しようとすると、私の問題が発生します。クエリ(後に続くコード)は意図したとおりに1つのメッセージを返しますが、最新のメッセージを返すことはできません。

私は無駄にこの記事で見つかった種類のすべてのバリエーションを試してみました
exports.getConversations = function(req, res, next) { 
    // Only return one message from each conversation to display as snippet 
    Conversation.find({ participants: req.user._id }) 
    .sort('-messages.createdAt') 
    .slice('messages', 1).exec(function(err, conversations) { 
    if (err) { 
     res.send({ error: err }); 
     return next(err); 
    } // other code... 

https://stackoverflow.com/a/15081087/5956144

答えて

2

あなたはソートするORM(その時遅いと悪い文書1)と格闘する必要はありません。ネストされたプロパティによるオブジェクトの配列あなたの素晴らしいパンツを着て、自分のソート機能をロールし、それを1日と呼んでください。 JavaScriptでのソートに

function byMessageCreatedAt(a, b){ 
    //modify the below comparison however you need to to compare two times 
    return a.messages.createdAt - b.messages.createdAt 
} 

var results = conversation.find({blah}).sort(byMessageCreatedAt); 

詳細は、私は避けるようにしようとしています物事のhere

+0

一つを発見した各会話のすべてのメッセージを要求するオーバーヘッドです。会話に何百、何千ものメッセージがあり、それがユーザーが自分の受信ボックスにアクセスするたびに引き出されていたら、それはかなり非効率的だろうか?たぶん私は間違っています。とても簡単なことをするより良い方法があるはずです。私はそれ以来集計を試みました。それらは私を近づけましたが、.find()または.select()を使用して結果をフィルタリングできなかったため、私のところにも行きませんでした。 –

+1

明確にする:mongooseによって提供される構文によるソートは構文的な砂糖です。使用するソート方法に関係なく、毎回結果セットをソートしています。あなたのコメントはオリジナルとはまったく異なる質問です。元の質問は「クエリの結果を並べ替える方法」でした。今度は、「結果セットをどのように制限するのか」と尋ねています。 –

関連する問題