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

MongoDB:配列フィールドに要素が含まれているかどうかを確認するにはどうすればよいですか?

    [編集 これに基づいて、最近のバージョンで可能になりました]

    [更新された回答]次の方法でクエリを実行して、クラスの名前と学生IDが既に登録されている場合にのみ、それらを取得できます。

    db.student.find({},
     {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})
    

    そして、あなたはあなたが期待したものを取り戻すでしょう:

    { "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
    { "name" : "Literature" }
    { "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
    

    【元の回答】現在やりたいことはできません。学生がオブジェクトとして配列に格納されている場合、これを実行できるため、これは残念です。実際、ObjectId()だけを使用していることに少し驚いています。常に 特定のコースに登録されている学生のリストを表示する場合は、学生を検索する必要があります(Idのリストを最初に検索してから、学生コレクションの名前を検索します。1つではなく2つのクエリです!)

    (例として)IDと名前を次のようにコース配列に格納している場合:

    {
            "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
            "name" : "Physics",
            "students" : [
                    {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                    {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
            ]
    }
    

    その場合、クエリは次のようになります。

    db.course.find( { }, 
                    { students : 
                        { $elemMatch : 
                           { id : ObjectId("51780f796ec4051a536015d0"), 
                             name : "Sam" 
                           } 
                        } 
                    } 
    );
    

    その学生がCS101にのみ登録されていた場合は、戻ってきます:

    { "name" : "Literature" }
    { "name" : "Physics" }
    {
        "name" : "CS 101",
        "students" : [
            {
                "id" : ObjectId("51780f796ec4051a536015cf"),
                "name" : "John"
            }
        ]
    }
    


    1. タグキャッシュのようなもので、Redisを使用してそれらを提案するためにそれをクエリします

    2. MongoDBがmLabを取得– MongoDBホスティングのさまざまな選択肢は何ですか?

    3. ClassNotFoundExceptionを解決する方法:com.mongodb.connection.BufferProvider?

    4. 水平方向にスケーリングされた分散システム向けの、Pub/SubでのRedisクラスターとZeroMQ