복붙노트

[MONGODB] 중첩 된 문서에 의해 MongoDB를 통합 프레임 워크 일치

MONGODB

중첩 된 문서에 의해 MongoDB를 통합 프레임 워크 일치

나는 다음과 같은 문서 목록을 가지고 :

{
    "_id" : "Tvq579754r",
    "name": "Tom",
    "forms": {
           "PreOp":{
             "status":"closed"          
           },

           "Alert":{
             "status":"closed"          
           },

           "City":{
              "status":"closed"         
           },

          "Country":{
             "status":"closed"          
          } 
    }
},
....
{
    "_id" : "Tvq444454j",
    "name": "Jim",
    "forms": {
          "Jorney":{
             "status":"closed"          
           },

          "Women":{
             "status":"void"            
          },

         "Child":{
            "status":"closed"           
         },

         "Farm":{
           "status":"closed"            
         }  
     }
}

나는 그들의 '상태'필드 ( 'forms.name_of_form.status')로를 필터링 할. 나는 '무효'동일 'forms.name_of_form.status을'이없는 모든 문서를 가져올 필요가있다.

예상 결과 (무효 형태의 상태가없는 문서)입니다 :

{
    "_id" : "Tvq579754r",
    "name": "Tom",
    "forms": {
           "PreOp":{
             "status":"closed"          
           },

           "Alert":{
             "status":"closed"          
           },

           "City":{
              "status":"closed"         
           },

          "Country":{
             "status":"closed"          
          } 
    }
}

해결법

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

    1.당신이 원하는 결과를 위해이 구조를 조회하여 사전에 가능한 형태의 이름을 모두 알고, 쿼리에서 그들을 사용하지 않고 할 수 없습니다. 그것은 어떤 속도로 매우 지저분 할 것이다. 그게 내가 그것을 할 수있는 방법을 설명로 읽어 말했다.

    당신이 원하는 결과를 위해이 구조를 조회하여 사전에 가능한 형태의 이름을 모두 알고, 쿼리에서 그들을 사용하지 않고 할 수 없습니다. 그것은 어떤 속도로 매우 지저분 할 것이다. 그게 내가 그것을 할 수있는 방법을 설명로 읽어 말했다.

    당신이 어떤 합리적인 쿼리 분석을하고 방지하는 것입니다 이러한 문서의 구조에 문제가 있습니다. 약자로 당신은 아무것도를 필터링하기 위해 가능한 모든 양식 이름 필드를 알고 있어야합니다.

    현재 구조는 각각의 키는 단일 등록 상태와 다른 하위 문서에 포함되어있는 하위 문서를 포함하는 형태를 갖는다. 이 양식 요소가 작성하는 각 문서에 대한 임의의 구조를 가지고로 통과하기가 어렵습니다. 즉, 컬렉션의 모든 문서에 대한 변경 내용을 비교하려는 상태 정보 하강 패턴을 의미한다.

    여기에 내가 경로는 무엇을 의미하는 것입니다. 모든 요소의 상태를 얻을하려면 다음을 수행해야

    항상 변화 번째 요소. 명명이 명시 적으로 간주 될 때이 같은 와일드 카드 뭔가 방법이 없습니다.

    이 양식에서 데이터를 직렬화 구현하는 쉬운 방법을 고려되었을 수도 있지만보다 유연한 대안을 참조하십시오. 당신이 필요하면 표준 패턴으로 통과 할 수있는 문서 구조입니다. 이것은 항상 디자인 고려 뭔가 가치가있다. 다음을 가지고 :

    {
        "_id" : "Tvq444454j",
        "name": "Jim",
        "forms": [
            {
                 "name": "Jorney",
                 "status":"closed"          
            },
            {
                "name": "Women",
                "status":"void"            
            },
            {
                "name": "Child",
                "status":"closed"           
            },
            {
                "name": "Farm",
                "status":"closed"            
            }  
        ]
    }
    

    문서의 구조는 키의 형태 요소 배열, 오히려 장소보다 상태 필드를 만들기 위해 변경 그래서 그 이름을 "양식 필드"우리가 "양식 필드를 cotaining 하위 문서로 배열의 각 구성원이 "이름과 상태를 표시합니다. 그래서 식별자와 상태 모두는 여전히 함께 짝하지만 지금 하위 문서로 표현. 이것은 가장 중요한 두 필드 이름을 이제,이 키에 대한 액세스 경로를 변경하고 그것의 상태는 우리가 할 수있는

    이것이 의미하는 것은 양식 또는 모든 상태 형태의 필드, 또는 특정 이름 필드와 특정 상태에있는 모든 문서의 모든 필드의 이름을 찾기 위해 쿼리 할 수 ​​있다는 것입니다. 그것은 훨씬 더 원래의 구조로 할 수있는 것보다입니다.

    이제 특별한 경우에, 당신은 모든 필드가 무효없는 문서 만 싶어. 이제이 방법으로 배열의 모든 요소를 ​​비교하고 이들이 동일한 지 확인 할 연산자가 없기 때문에이 작업을 수행하는 하나의 쿼리 방법이 없습니다. 그러나 당신이 취할 수있는 방법은 두 가지가 있습니다 :

    첫 번째와 아마 효율적인은 "무효"의 상태가 형태의 요소를 포함하는 모든 문서에 대한 쿼리입니다. 결과 문서로 ID가 다른 쿼리를 실행할 수있어 수익률이없는 문서 지정된 이드의의.

    db.forms.find({ "forms.status": "void" },{ _id: 1})
    
    db.forms.find({ _id: $not: { $in: [<Object1>,<Object2>,<Object3>,... ] } })
    

    지정된 결과 크기이 불가능하고 일반적으로 인덱스를 사용하지 수 있도록 제외 운영자 $ 기본적으로, 컬렉션의 전체 검사를 강요하지 좋은 생각이 아니다 있습니다.

    다음과 같이 또 다른 방법은 집계 파이프 라인을 사용하는 것입니다 :

    db.forms.aggregate([
        { "$unwind": "$forms" },
        { "$group": { "_id": "$_id", "status": { "$addToSet": "$forms.status" }}},
        { "$unwind": "$status" },
        { "$sort": { "_id": 1, "status": -1 }},
        { "$group": { "_id": "$_id", "status": { "$first": "$status"}}},
        { "$match":{ "status": "closed" }}
    ])
    

    물론 문서 만이 경기를 위해 _id를 반환합니다,하지만 당신은 전체 일치하는 문서에 $에 쿼리를 실행하고 반환 할 수 있습니다. 이 제외 운영자가 이전에 사용하고, 지금 우리는 전체 수집 검색을 피하기 위해 인덱스를 사용할 수있는 것보다 더 낫다.

    최종 접근과 최고의 성능 고려 사항에 관해서는, 당신은 최고 수준에서 당신의 "상태"를 유지하는 것이 매우 문서를 다시 변경할 수 있는지 여부 "무효"또는 "폐쇄"의 형태로 모든 필드. 그래서 최상위 수준에 값이 모든 항목 뭔가가 무효 인 경우에 "폐쇄"과 "무효"했다, 등등 경우에만 폐쇄 될 것이다.

    그 마지막 하나는 더 프로그램의 변화를 의미하고, 양식 항목에 대한 모든 변경 사항은 "상태"를 유지하기 위해뿐만 아니라이 필드를 업데이트해야합니다. 그러나 그것은 당신이 필요로하는 문서를 찾는 가장 효율적인 방법입니다 및 가치가 고려 될 수있다.

    편집하다:

    이외에도 마스터 상태를 가지고 문서를 변경하는 개정 된 구조에 대한 빠른 쿼리 양식은 실제로 :

    db.forms.find({ "forms": { "$not": { "$elemMatch": { "status": "void" } } } })
    
  2. from https://stackoverflow.com/questions/21623979/mongodb-aggregation-framework-match-by-nested-documents by cc-by-sa and MIT license