2013-03-12 4 views
0

고객이 사용자 지정 데이터를 보낼 수있는 응용 프로그램을 만들고 있는데이 사용자 지정 데이터는 "쿼리 가능"해야합니다. 고객이이 필드를 검색 할 수 있음을 의미합니다. 아래의 사용자에 대한 전송맞춤형 고객 데이터를 쿼리하는 가장 좋은 방법은 무엇입니까?

데이터 :

data = { 
    name: "Thiago", 
    id: 2093 
    country: "Portugal", 
    custom_data: { 
    company: "foo", 
    plan: "pro", 
    department: "it", 
    sessions: 203 
    } 
} 

인해 응용 프로그램 방식없는 요구에, 우리는 데이터를 유지하기 위해 MongoDB를 사용하고 있습니다.

하지만 이러한 맞춤 데이터를 어떻게 쿼리하는지 궁금합니다. 우리는이 분야에 대한 색인을 가지고 있지 않으며 ~ 1.3M의 많은 문서가 있습니다.

나는 elasticsearch를 사용하여이 요구 사항을 처리 할 수 ​​있다고 생각하지만 사용하지 않으면 좋은 접근법이 있습니까? mongodb 만 사용 하시겠습니까?

한 쿼리의 예는 수 :

포르투갈의 모든 찾기 및 100 개 이상의 로그인을해야합니다. 사전에

감사

+0

임의의 문서와 임의의 쿼리가 있습니까? 그렇다면 모든 문서를 검사해야하므로 쿼리를 수행 할 때마다 쿼리가 느리게 처리됩니다. 메모리에있는 모든 것조차도 불행하게도 색인 없이는 빠르지도 효율적이지 않을 것입니다. – WiredPrairie

+0

@ WiredPrairie right. 내 문서의 색인을 달려면 elasticsearch를 사용합니다. 각 세입자는 ES 내부에 자신의 색인을 갖습니다. 이 접근 방식이 올바른지 궁금합니다. 어떻게 생각하십니까? elasticsearch는이 시나리오에 대한 좋은 접근 방법입니까? – CHAPa

+0

데이터 유형 (> 100)이 필요하고 모든 조합에 대해 색인을 생성 할 수 없다는 점을 감안할 때 (컬렉션 당 최대 64 개의 색인이 있으므로 정기적으로 16 개 이하를 유지하도록 권장 함) MongoDB에서 이것을 모델링하는 논리적 인 방법. 하나는있을 수 있지만 분명하지 않습니다. – WiredPrairie

답변

0

당신은 당신의 데이터를 동적과 같이 "입력"키 - 값 쌍의 배열로 조회 할 저장할 수 : .type에

query_data: [ 
    { type: "company", value: "foo" }, 
    { type: "plan", value: "pro" }, 
    ... 
    ] 

다음 인덱스 및 .value

귀하의 예를 감안할 때,이 같을 것이다 :

> db.xx.findOne() 
{ 
    "_id" : ObjectId("515ca2bc57a0887a97cc8d14"), 
    "name" : "Thiago", 
    "id" : 2093, 
    "country" : "Portugal", 
    "custom_data" : [ 
     { 
      "type" : "company", 
      "value" : "foo" 
     }, 
     { 
      "type" : "plan", 
      "value" : "pro" 
     }, 
     { 
      "type" : "department", 
      "value" : "it" 
     }, 
     { 
      "type" : "sessions", 
      "value" : 203 
     } 
    ] 
} 
> db.xx.ensureIndex({country:1,"custom_data.type":1,"custom_data.value":1}) 
> db.xx.find({country:"Portugal","custom_data.type":"sessions","custom_data.value":{$gt:100}}).explain() 
{ 
    "cursor" : "BtreeCursor country_1_custom_data.type_1_custom_data.value_1", 
    "isMultiKey" : true, 
    "n" : 1, 
    "nscannedObjects" : 1, 
    "nscanned" : 1, 
    "nscannedObjectsAllPlans" : 1, 
    "nscannedAllPlans" : 1, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "country" : [ 
      [ 
       "Portugal", 
       "Portugal" 
      ] 
     ], 
     "custom_data.type" : [ 
      [ 
       "sessions", 
       "sessions" 
      ] 
     ], 
     "custom_data.value" : [ 
      [ 
       { 
        "$minElement" : 1 
       }, 
       { 
        "$maxElement" : 1 
       } 
      ] 
     ] 
    }, 
    "server" : "Aspire-5750:27017" 
} 
,536,913,632 10
+0

감사합니다. @ronasta! 정말 당신이 대답을 즐기십시오. 내 문제를 해결하십시오! – CHAPa

관련 문제