복붙노트

[MONGODB] MongoDB를 : 배열 필드가 요소가있는 경우에 방법을 알아 보려면?

MONGODB

MongoDB를 : 배열 필드가 요소가있는 경우에 방법을 알아 보려면?

나는 두 개의 컬렉션을 가지고있다. 첫 번째 컬렉션 학생을 포함 :

{ "_id" : ObjectId("51780f796ec4051a536015cf"), "name" : "John" }
{ "_id" : ObjectId("51780f796ec4051a536015d0"), "name" : "Sam" }
{ "_id" : ObjectId("51780f796ec4051a536015d1"), "name" : "Chris" }
{ "_id" : ObjectId("51780f796ec4051a536015d2"), "name" : "Joe" }

두 번째 컬렉션 과정이 포함되어 있습니다

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
        "name" : "CS 101",
        "students" : [
                ObjectId("51780f796ec4051a536015cf"),
                ObjectId("51780f796ec4051a536015d0"),
                ObjectId("51780f796ec4051a536015d2")
        ]
}
{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc5"),
        "name" : "Literature",
        "students" : [
                ObjectId("51780f796ec4051a536015d0"),
                ObjectId("51780f796ec4051a536015d0"),
                ObjectId("51780f796ec4051a536015d2")
        ]
}
{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                ObjectId("51780f796ec4051a536015cf"),
                ObjectId("51780f796ec4051a536015d0")
        ]
}

각 과정의 문서는 과정 등록 학생의 목록이 학생들의 배열이 포함되어 있습니다. 학생이 웹 페이지의 과정을 볼 때 그는 이미 코스 여부 등록되어 있는지 확인해야합니다. 그렇게하기 위해, 과정 수집이 학생을 대신하여 조회됩니다 때, 우리는 학생들 배열이 이미 학생의 ObjectId가 포함되어 있는지 확인해야합니다. 가있는 경우에만 학생 배열에서 학생 ObjectId가를 검색 찾기 쿼리의 돌출부에 지정할 수있는 방법이 있습니까?

나는 elemMatch 연산자를 $ 할 수 있지만,이 하위 문서의 배열에 맞도록되어 있는지 확인하기 위해 노력했다. 나는 통합 프레임 워크를 사용할 수 있다는 것을 이해하지만,이 경우 과잉에있을 것으로 보인다. 집계 프레임 워크는 아마도 하나 찾기 쿼리만큼 빠르지 않을 것이다. 반환 된 문서는 다음과 유사한 형태가 될 수 있도록하는 쿼리 코스 수집하는 방법은 무엇입니까?

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
        "name" : "CS 101",
        "students" : [
                ObjectId("51780f796ec4051a536015d0"),
        ]
}

해결법

  1. ==============================

    1.[편집이에 따라 현재 최신 버전에서 가능한 것]

    [편집이에 따라 현재 최신 버전에서 가능한 것]

    [업데이트 답변] 당신은 클래스의 이름과 이미 등록되어있는 경우에만 학생 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를 먼저보기의 목록을 찾아 사용하는 놀랐어요 학생들 컬렉션에서 이름까지! - 두 개의 쿼리 하나가 아닌)

    이 같은 코스 배열의 아이디 (예를 들어)와 이름을 저장 한 경우 :

    {
            "_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" 
                           } 
                        } 
                    } 
    );
    

    그 학생 만 CS (101)에 등록 된 경우 다시 얻을 것입니다 :

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

    2.그것은 잘 당신의 목적을 이룰 것입니다 운영자에 $처럼 보인다.

    그것은 잘 당신의 목적을 이룰 것입니다 운영자에 $처럼 보인다.

    이 (의사 쿼리)와 같은 뭔가를 할 수 :

    if (db.courses.find({"students" : {"$in" : [studentId]}, "course" : courseId }).count() > 0) {
      // student is enrolled in class
    }
    

    다른 방법으로는 "물론"제거 할 수 있습니다 : courseId 절을하고, 학생에 등록되어 모든 클래스의 세트를 다시 얻을.

  3. ==============================

    3.나는 그것에 문제 설명과 솔루션을 넣어 설명하려합니다. 나는 그것이 도움이되기를 바랍니다

    나는 그것에 문제 설명과 솔루션을 넣어 설명하려합니다. 나는 그것이 도움이되기를 바랍니다

    문제 설명:

    이름이 ABC 제품 또는 PQR 제품 같은 모든 게시 된 제품을 찾아 가격은 15 미만이어야한다 / -

    해결책:

    다음은 알아서해야하는 조건은

    다음은 쿼리를 생성하고 데이터를 가져 오기 위해 기준 이상으로 적용되는 문입니다.

    $elements = $collection->find(
                 Array(
                    [price] => Array( [$lt] => 15 ),
                    [$or] => Array(
                                [0]=>Array(
                                        [product_name]=>Array(
                                           [$in]=>Array(
                                                [0] => ABC Product,
                                                [1]=> PQR Product
                                                )
                                            )
                                        )
                                    ),
                    [state]=>Published
                    )
                );
    
  4. from https://stackoverflow.com/questions/16198429/mongodb-how-to-find-out-if-an-array-field-contains-an-element by cc-by-sa and MIT license