MongoDB 중첩 배열 쿼리
저는 이것을 다른 질문에 대한 코멘트로 요청했고, 또한 mongodb-user에 질문을 올렸습니다.지금까지 아무런 답변이 없어서 따로 문의드립니다.
설명서에는 다음이 명시되어 있습니다.
필드에 배열이 있는 경우 $in 연산자는 지정된 배열의 값(예: , 등)과 일치하는 적어도 하나의 요소를 포함하는 배열이 있는 필드의 문서를 선택합니다.
사용 중:
mongod --version:
db version v2.2.2, pdfile version 4.5
Thu May 30 12:19:12 git version: d1b43b61a5308c4ad0679d34b262c5af9d664267
mongo --version:
MongoDB shell version: 2.0.4
MongoDB 셸에서:
db.nested.insert({'level1': {'level2': [['item00', 'item01'], ['item10', 'item11']]}})
다음은 설명서에 따라 작동해야 하는 쿼리 목록과 쿼리 결과입니다.
왜 안 되는 거지?
> db.nested.findOne({'level1.level2.0': 'item00'})
null
제가 왜 $all이 필요하죠?
> db.nested.findOne({'level1.level2.0': {'$all': ['item00']}})
{
"_id" : ObjectId("51a7a4c0909dfd8872f52ed7"),
"level1" : {
"level2" : [
[
"item00",
"item01"
],
[
"item10",
"item11"
]
]
}
}
다음 중 적어도 하나는 작동해야 합니다, 그렇죠?
> db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})
null
> db.nested.findOne({'level1.level2': {'$in': ['item00']}})
null
아이디어 있어요?우리는 만약 쿼리 구문이 광고대로 작동하지 않는다면 MongoDB를 포기하는 것을 고려하고 있습니다.
감사합니다!
몇 가지 쿼리를 실행한 후, $in은 어레이 어레이에서 작동하지 않는다는 결론에 도달했습니다.
사용할 수 있습니다.$elemMatch
대신에 작동할 것이지만, MongoDB의 문서가 이에 대해 경고하지 않는 것은 실망스러운 일입니다.
이 문서를 작성했습니다.
{
"_id": "51cb12857124a215940cf2d4",
"level1": [
[
"item00",
"item01"
],
[
"item10",
"item11"
]
],
"items": [
"item20",
"item21"
]
}
항목 필드는 문자열 배열이며 이 쿼리는 완벽하게 작동합니다.
db.nested.findOne({"items":{"$in":["item20"]} })
자, "레벨 1.0"은 문자열 배열이기도 하지만, 유일한 차이점은 문자열이 다른 배열 안에 있다는 것입니다.이 쿼리는 작동해야 하지만 작동하지 않습니다.
db.nested.findOne({"level1.0":{"$in":["item00"]} })
결과를 얻을 수 있는 유일한 방법은 $elemMatch:
db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })
그렇게$elemMatch
문제를 해결하지만, 진정한 해결책은 MongoDB의 문서를 다음과 같이 업데이트하는 것입니다.$in
어레이 어레이에서는 작동하지 않습니다.아마도 당신은 10gen에 요청서를 제출해야 할 것 같습니다.
중첩 사용elemMatch
배열 내에서 중첩 수준을 검색합니다.
간단한 답변: $in은 단일 값 필드에 대한 값이고 $all은 어레이에 대한 값입니다.
첫번째,db.nested.findOne({'level1.level2.0': 'item00'})
수준 1.level 2.0이 배열을 보유하고 있고 단일 값으로 비교하려고 하기 때문에 작동하지 않습니다.
지금이다,db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})
비슷한 이유로 작동하지 않습니다.$in은 단일 값(어레이가 있음)을 가진 필드와 배열의 여러 값(쿼리에 지정됨)을 비교하는 데 사용됩니다.$in은 말합니다: 이 배열에 포함된 값이 이 필드에 있는 문서를 주세요.
$all이 작동하는 이유는 다음과 같습니다. 이 필드에 여러 값이 있고 이 배열의 모든 값(쿼리)이 해당 필드에 포함되어 있는 문서를 주세요.(계속)
구하기 어려울 수도 있지만 설명서에 나와 있는 내용을 확인해 보십시오.
$all 필드에 배열이 저장되고 모든 요소가 포함된 문서를 선택합니다.
(e.g. <value>, <value1>, etc.
에 포함됩니다.를 배열합니다.$in 필드 값이 지정된 배열의 모든 값과 동일한 문서를 선택합니다.
e.g. <value1>, <value2>, etc.
)
도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/17303833/mongodb-nested-array-query
'programing' 카테고리의 다른 글
Xcode에 개발팀이 표시되지 않습니다. (0) | 2023.07.14 |
---|---|
sscanf가 있는 공백이 있는 문자열 읽기 (0) | 2023.07.14 |
Linux 프레임 버퍼를 통해 화면에 픽셀 그리기 (0) | 2023.07.14 |
각도 라우팅이란 무엇입니까? (0) | 2023.07.14 |
새 줄 '\n'이(가) 유형 스크립트에서 작동하지 않습니다. (0) | 2023.07.14 |