prosource

MongoDB: 배열 필드에 요소가 포함되어 있는지 확인하는 방법

probook 2023. 3. 4. 15:00
반응형

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")
        ]
}

각 과정 문서에는 다음이 포함됩니다.students과정에 등록된 학생 목록이 있는 배열입니다.학생이 웹 페이지에서 과정을 볼 때 이미 과정에 등록했는지 확인해야 합니다.그러기 위해서는,courses학생을 대신하여 컬렉션이 조회됩니다. 우리는 이 컬렉션이 어떤 것인지 아닌지를 알아내야 합니다.students배열에 학생의 ObjectId가 이미 포함되어 있습니다.학생을 검색하기 위해 찾기 쿼리 투영에 지정할 수 있는 방법이 있습니까?ObjectId부터students어레이가 있는 경우에만?

$elemMatch 오퍼레이터를 사용할 수 있는지 알아보려고 했지만, 일련의 서브 문서를 대상으로 하고 있습니다.집약 프레임워크를 사용할 수 있는 것은 알고 있습니다만, 이 경우는 과잉인 것 같습니다.집약 프레임워크는 단일 검색 쿼리만큼 빠르지 않을 수 있습니다.반환된 문서가 이와 유사한 형식일 수 있도록 과정 모음을 질의할 수 있는 방법이 있습니까?

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

[최근 버전에서는 이를 바탕으로 편집 가능]

[갱신된 답변] 이미 등록된 경우에만 다음 방법으로 클래스 이름과 학생 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와 이름을 저장하는 경우(예:):

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

오퍼레이터가 당신의 목적에 잘 부합할 것 같군요.

다음과 같은 작업을 수행할 수 있습니다(의사 쿼리).

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

'아까보다'를 제거할 ."course" : courseId학생이 등록한 모든 수업 세트를 돌려받을 수 있습니다.

저는 문제점과 해결책을 제시하여 설명하려고 합니다.도움이 되었으면 좋겠다

문제 설명:

ABC 제품 또는 PQR 제품 등의 이름으로 가격이 15 미만인 모든 공개 제품을 찾습니다.

솔루션:

아래는 주의해야 할 조건입니다.

  1. 제품 가격은 15 미만이어야 합니다.
  2. 제품 이름은 ABC 제품 또는 PQR 제품 중 하나여야 합니다.
  3. 제품은 게시된 상태여야 합니다.

아래는 쿼리 및 가져오기 데이터를 작성하기 위해 위의 기준을 적용하는 문장입니다.

$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
                )
            );

언급URL : https://stackoverflow.com/questions/16198429/mongodb-how-to-find-out-if-an-array-field-contains-an-element

반응형