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 미만인 모든 공개 제품을 찾습니다.
솔루션:
아래는 주의해야 할 조건입니다.
- 제품 가격은 15 미만이어야 합니다.
- 제품 이름은 ABC 제품 또는 PQR 제품 중 하나여야 합니다.
- 제품은 게시된 상태여야 합니다.
아래는 쿼리 및 가져오기 데이터를 작성하기 위해 위의 기준을 적용하는 문장입니다.
$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
'prosource' 카테고리의 다른 글
각도로 절연 스코프 지시어를 테스트하는 방법JS (0) | 2023.03.04 |
---|---|
스프링 부트에서의 spring-data-mongodb 자동 설정을 디세블로 하는 방법 (0) | 2023.03.04 |
WooCommerce: 체크아웃 시 한 개의 주/시로 사전 선택 및 제한 (0) | 2023.03.04 |
워드프레스 데이터베이스에서 제품 속성을 가져오는 방법 (0) | 2023.03.04 |
스크롤이 80%에 도달하면 에이잭스 로드 (0) | 2023.03.04 |