복붙노트

[MONGODB] MongoDB의 중첩 배열 쿼리

MONGODB

MongoDB의 중첩 배열 쿼리

나는 또 다른 질문에 주석으로이 물었다, 또한 MongoDB를 사용자의 질문을 게시했습니다. 어떤 응답은 지금까지, 그래서 별도의 질문을에 의존하지거야.

문서 상태 :

내가 사용하고 있습니다 :

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

이유는 $ 모든 필요합니까?

> 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를 포기 고려하고 있습니다.

감사!

해결법

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

    1.일부 쿼리를 실행 한 후, 나는에이 배열의 배열 작동하지 않습니다 $ 있다는 결론에 도달했다.

    일부 쿼리를 실행 한 후, 나는에이 배열의 배열 작동하지 않습니다 $ 있다는 결론에 도달했다.

    대신 $ elemMatch를 사용할 수 있으며 작동합니다,하지만 MongoDB의 설명서 그것에 대해 경고하지 않습니다 실망.

    나는이 문서를 만든 :

    {
          "_id": "51cb12857124a215940cf2d4",
          "level1": [
            [
              "item00",
              "item01"
            ],
            [
              "item10",
              "item11"
            ]
          ],
          "items": [
            "item20",
            "item21"
          ]
    }
    

    공지 사항 필드 "항목은"문자열 배열이라고이 쿼리는 완벽하게 작동합니다 :

    db.nested.findOne({"items":{"$in":["item20"]} })
    

    이제, "level1.0는"유일한 차이점은 다른 배열 안에 있다는 것입니다, 또한 문자열의 배열입니다. 작동해야하지만이 쿼리는되지 않습니다 :

    db.nested.findOne({"level1.0":{"$in":["item00"]} })
    

    결과를 얻을 수있는 유일한 방법은 $ elemMatch을 사용하고 있습니다 :

    db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })
    

    $ elemMatch 문제를 해결하지만, 실제 솔루션은 $에이 배열의 배열에 대한 작업을하지 않는 상태로 MongoDB의 설명서를 업데이트하는 것입니다 그래서. 아마 당신은 10gen에 요청을 제출해야합니다.

  2. ==============================

    2.사용 배열 내에서 중첩 수준을 검색 할 elemMatch 중첩.

    사용 배열 내에서 중첩 수준을 검색 할 elemMatch 중첩.

    세부 쿼리하여 MongoDB의 배열의 배열

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

    3.짧은 답변 :에 $는 단일 값 필드이며, $ 모든 배열입니다.

    짧은 답변 :에 $는 단일 값 필드이며, $ 모든 배열입니다.

    첫째, db.nested.findOne ({ 'level1.level2.0': 'item00는'}) level1.level2.0 배열을 보유하고 단일 값과 비교하려고하기 때문에 일을하지 않습니다.

    이제 db.nested.findOne ({ 'level1.level2.0'{ '에 $': [ 'item00는']}}) 때문에 비슷한 이유 중 하나가 작동하지 않습니다. 달러 것은 (쿼리에 지정된) 배열의 여러 값을 하나의 값 (당신이 배열을 가지고)와 필드를 비교하는 것입니다.  달러는 말하고있다 : 나에게이 배열에 포함 된 값이 필드를 가지고있는 문서를 제공합니다.

    나에게 몇 가지 값 (쿼리)이 배열의 모든 값이 필드가 워드 프로세서 해당 필드에 포함되어 제공 : 말 때문에 모두가 노력하고 있습니다 $. (편집)

    얻을 수 있지만, 문서가 각각 말씀을 보면 하드 될 수 있습니다

    희망이 도움이

  4. from https://stackoverflow.com/questions/17303833/mongodb-nested-array-query by cc-by-sa and MIT license