私のスキーマ:
export const MessagesAllSchema = new Schema({
senderName: {type: String, required: true},
senderId: {type: String, required: true},
content: String,
date: {type: Date, default: Date.now()},
roomId: Schema.Types.ObjectId,
});
私の質問:
AllMessages.find(
{roomId: [roomId1, roomId2]},
(err, messages) => {
console.log(messages);
},
).sort({date: -1});
私のコードが返されます
私のコードは、部屋1と部屋2からいくつかのメッセージを返します。
達成したい
コードで部屋1に1つのメッセージ、部屋2に1つのメッセージを返したいのですが、.limi(2)を適用すると、部屋1に2つのメッセージが表示されますが、部屋ごとに1つのメッセージが表示されます。
それは不可能find()
です、あなたはaggregate()メソッドを試すことができます、
$match
roomIdの配列内のroomId$group
よるroomId
と、最初のメッセージフォームの複数のグループ化されたメッセージを取得root
変数を$replceWith
ルート内のルートオブジェクトを置き換える$sort
日付の降順$limit
2つのドキュメントのみconst messages = await AllMessages.aggregate([
{
$match: {
roomId: { $in: [roomId1, roomId2] }
}
},
{
$group: {
_id: "$roomId",
root: { $first: "$$ROOT" }
}
},
{ $replaceWith: "$root" },
{ $sort: { date: -1 } },
{ $limit: 2 }
]).exec();
console.log(messages);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加