>

숫자 키가있는 중첩 컬렉션을 쿼리하는 방법은 무엇입니까?

키를 알면 특정 컬렉션을 하나 선택할 수 있지만 모르는 경우 어떻게해야합니까? "마스크/패턴"의 종류가 있습니까? 나는 mongodb를 처음 사용하므로 여전히 어려움을 겪고 있습니다.

컬렉션 예 :.

{
    "_id" : ObjectId("598842f22605c6cb8de9db78"),
    "17" : {
        "name" : "some name 1",
    },
    "18" : {
        "name" : "some name 2",
    },
    "19" : {
        "name" : "some name 3",
    }
},
{ ... }

수행 할 수있는 작업 (숫자 키를 알고있는 경우 선택) :

db.getCollection('my.collection').find({'17.name' : 'some name 1'});

지금까지 나의 수색은 결실이 없었습니다. 적어도 누군가 나를 올바른 방향으로 안내 할 수 있습니까? 내가 기대하는 것 :

db.getCollection('my.collection').find({'#.name' : 'some name 1'}); <-- return every record from collection that has specified name and any numerical key

  • 답변 # 1

    CrazySabbath,이 경우 중첩 된 컬렉션이 아닌문서가 있습니다. MongoDB 문서는 포함 된 문서 인 다른 문서를 중첩 할 수 있습니다.

    mongo 셸을 사용하면 ( .getCollection() 를 사용하지 않고도) 컬렉션 이름을 사용하여 직접 쿼리 할 수 ​​있습니다. ) :

    db.myCollection.find({...})
    
    

    쿼리하는 경우, 포함 된 문서에 액세스하기 전에 오른쪽 필드에 대한 포인터가 필요하기 때문에 도트 표기법을 사용하여 중첩 된 문서 키에 대해 "마스크"가있는 쿼리를 가질 수 없습니다. 귀하의 예에서 더 나은 문서 구조는 실제로 다음과 같이 ID가 숫자 인 문서 배열입니다.

    {
      "_id" : ObjectId("598842f22605c6cb8de9db78"),
      "nested":[
        {
          "_id": "17", "name" : "some name 1"
        },
        {
          "_id": "18", "name" : "some name 2"
        },
        {
          "_id": "19", "name" : "some name 3"
        }
      ]
    }
    
    

    이 기능을 사용하면 점 표기법을 사용하여 쿼리 할 수 ​​있지만 ID를 모르면 다음과 같은 작업을 수행 할 수 있습니다.

    db.myCollection.find({"nested._id": {$gt: "17"}})
    // This will return all documents in the collection myCollection that has at least one nested document in its nested array with _id greater than "17"
    
    

    대신 중첩 된 문서 만 반환하려면 (질문의 구조를 사용하여) 문서 반환에 대한 투영을 수행 할 수 있습니다.

    db.myCollection.find({"17.name": "some name 1"}, {"_id": 0, "18":0, "19": 0}) //= {"17" : { "name" : "some name 1" } }
    //This will find a document with nested "17" (the key for a nested document) that has name as "some name 1", but projecting only the "17" document
    
    

    중첩 된 문서 만 사용해야하고 중첩을 수행하는 문서를 신경 쓰지 않는 경우 여기서 더 나은 구조는이 "17", "18"및 "19"를 다른 컬렉션에 배치하는 것입니다. 이 숫자는 ID입니다. 점 표기법 설명서를 참조하십시오

  • 이전 sql server - SQL MERGE 디버깅
  • 다음 azure - arm 템플릿 - alertrules :미 공급