集約フレームワークを使用して照会することができます。クエリには、pipelineが含まれ、入力文書を処理して所望の結果を得る段階があります。あなたのケースでは、パイプラインは$match
フェーズを持ち、初期フィルタのクエリとして機能します。 $match
は標準のMongoDBクエリを使用するため、依然として$in
を使用してクエリできます。
次の手順は、フィルタリングされたドキュメントをcreatedAt
フィールドでソートすることです。これは、$sort
の演算子を使用して行われます。
上記のパイプラインステージでは、順序付けされたドキュメントを集約して、各グループの先頭のドキュメントを返します。 $group
演算子と$first
アキュムレータは、これを可能にする演算子です。完全にあなたが希望する結果を取得するには、以下の集約演算を実行することができ、これを置く
:
memberTags = [1,2,3,4,5];
ClanMember.aggregate([
{ "$match": { "tag": { "$in": memberTags } } },
{ "$sort": { "tag": 1, "createdAt: -1 " } },
{
"$group": {
"_id": "$tag",
"createdAt": { "$first": "$createdAt" } /*,
include other necessary fields as appropriate
using the $first operator e.g.
"otherField1": { "$first": "$otherField1" },
"otherField2": { "$first": "$otherField2" },
...
*/
}
}
]).exec(function(err, members) {
res.json(members);
});
それとも2つのフィールドで並べ替えることができるようにfind()
を使用して現在のクエリを微調整は、(tag
、すなわち昇順)およびcreatedAt
(降順)属性です。その後、制限、次のようなものを使用して、トップ5の文書を選択することができます。
memberTags = [1,2,3,4,5];
ClanMember.find(
{ 'tag': { $in: memberTags } }, // query
{}, // projection
{ // options
sort: { 'createdAt': -1, 'tag': 1 },
limit: memberTags.length,
skip: 0
}
).lean().exec(function(err, members) {
res.json(members);
});
または
memberTags = [1,2,3,4,5];
ClanMember.find({
'tag': {
$in: memberTags
}
}).sort('-createdAt tag')
.limit(memberTags.length)
.lean()
.exec(function(err, members) {
res.json(members);
});
は、集約を介して行うことができます。 –