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
一つを発見した各会話のすべてのメッセージを要求するオーバーヘッドです。会話に何百、何千ものメッセージがあり、それがユーザーが自分の受信ボックスにアクセスするたびに引き出されていたら、それはかなり非効率的だろうか?たぶん私は間違っています。とても簡単なことをするより良い方法があるはずです。私はそれ以来集計を試みました。それらは私を近づけましたが、.find()または.select()を使用して結果をフィルタリングできなかったため、私のところにも行きませんでした。 –
明確にする:mongooseによって提供される構文によるソートは構文的な砂糖です。使用するソート方法に関係なく、毎回結果セットをソートしています。あなたのコメントはオリジナルとはまったく異なる質問です。元の質問は「クエリの結果を並べ替える方法」でした。今度は、「結果セットをどのように制限するのか」と尋ねています。 –