特定の基準で結果を「重み付け」する場合、または「ソート」内に何らかの「計算値」を含める場合は、.aggregate()
が必要です。 代わりにメソッド。これにより、「投影された」値を $sort
で使用できるようになります ドキュメント内の現在のフィールドのみを使用できる操作:
db.messages.aggregate([
{ "$match": { "messages": userId } },
{ "$project": {
"recipients": 1,
"unread": 1,
"content": 1,
"readYet": {
"$setIsSubset": [ [userId], "$unread" ] }
}
}},
{ "$sort": { "readYet": -1 } },
{ "$limit": 20 }
])
ここで$setIsSubset
演算子を使用すると、「未読」配列を[userId]
の変換された配列と比較できます。 一致するものがあるかどうかを確認します。結果はtrue
になります userIdが存在する場所またはfalse
そうでないところ。
次に、これを$sort
に渡すことができます 、一致を優先して結果を並べ替えます(降順の並べ替えはtrue
です 上に)、最後に$limit
指定された量までの結果を返すだけです。
したがって、「並べ替え」に計算された用語を使用するには、値をドキュメントに「投影」して、並べ替えることができるようにする必要があります。集約フレームワークは、これを行う方法です。
$elemMatch
にも注意してください 配列内の単一の値を照合するためだけに必要なわけではなく、値を直接指定するだけで済みます。その目的は、単一の配列要素で「複数の」条件が満たされる必要がある場合ですが、もちろんここでは適用されません。