sql >> データベース >  >> NoSQL >> MongoDB

mongodbの内部で一致するフィールド

    可能であれば、データを保存するときに条件を設定して、迅速な真実のチェックを実行できるようにすることをお勧めします(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
    }
    

    手順の簡単な説明:

    1. studentIdだけでドキュメントの投影を作成します idのみを含む配列を持つ新しいフィールド (したがって、最初のドキュメントには[23, 55]が含まれます。 。
    2. その構造を使用して、 $ unwind 。これにより、studentIdCompの配列要素ごとに新しい一時ドキュメントが作成されます。 配列。
    3. 次に、これらのドキュメントを取得して、studentIdを引き続き保持する新しいドキュメントプロジェクションを作成します。 isStudentEqualという新しいフィールドを追加します studentIdという2つのフィールドの同等性を比較します およびstudentIdComp 。この時点で、これら2つのフィールドを含む1つの一時的なドキュメントがあることに注意してください。
    4. 最後に、比較値がisStudentEqualであることを確認します trueであり、それらのドキュメントを返します(元のドキュメント_idが含まれます) およびstudentId
    5. 生徒がリストに複数回含まれている場合は、結果をstudentIdにグループ化する必要がある場合があります。 または_id 重複を防ぐためです(ただし、それが必要かどうかはわかりません)。


    1. MongoDBはクエリに対して許可されていません-コード13

    2. Mongoユーザー定義関数とMapReduce

    3. Mongodbで、セカンダリノード(レプリカセット)のみのコレクション内のフィールドにインデックスを付けるにはどうすればよいですか?

    4. サブドキュメントまたはアレイのみを選択します