programing

MongoDB 중첩 배열 쿼리

javamemo 2023. 7. 14. 23:21
반응형

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배열 내에서 중첩 수준을 검색합니다.

세부 정보 MongoDB에서 배열 쿼리

간단한 답변: $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

반응형