可能であれば、データを保存するときに条件を設定して、迅速な真実のチェックを実行できるようにすることをお勧めします(isInStudentsList
)。この種のクエリを実行するのは非常に高速です。
それ以外の場合は、集約フレームワークパイプラインを使用して、単一のクエリで必要な処理を実行する比較的複雑な方法があります。
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
入力例を考えると、出力は次のようになります。
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
手順の簡単な説明:
-
studentId
だけでドキュメントの投影を作成しますid
のみを含む配列を持つ新しいフィールド (したがって、最初のドキュメントには[23, 55]
が含まれます。 。 - その構造を使用して、 $ unwind
。これにより、
studentIdComp
の配列要素ごとに新しい一時ドキュメントが作成されます。 配列。 - 次に、これらのドキュメントを取得して、
studentId
を引き続き保持する新しいドキュメントプロジェクションを作成します。isStudentEqual
という新しいフィールドを追加しますstudentId
という2つのフィールドの同等性を比較します およびstudentIdComp
。この時点で、これら2つのフィールドを含む1つの一時的なドキュメントがあることに注意してください。 - 最後に、比較値が
isStudentEqual
であることを確認します trueであり、それらのドキュメントを返します(元のドキュメント_id
が含まれます) およびstudentId
。 - 生徒がリストに複数回含まれている場合は、結果を
studentId
にグループ化する必要がある場合があります。 または_id
重複を防ぐためです(ただし、それが必要かどうかはわかりません)。