2011-01-26 9 views
2

내가 작업하고있는 응용 프로그램에서 요구 사항은 10-1,000,000 개 정도의 큰 조정 교차로입니다. 우리가 교차하는 항목은 단순히 ObjectId입니다.mongodb의 서버 측 교차점

예를 들어 상자 문서가 있고 상자 문서 안에 item_ids 배열이 있습니다. 각 상자에 대한이 item_ids 배열에는 10-1,000,000 개의 ObjectId가 있습니다.

여기서 마지막 목표는 ObjectId가 4d3dc3898951498107000005 인 상자 A와 ObjectId가 4d3dc3898951498107000002 인 상자 B를 공통으로 가진 item_ids라고 가정하는 것입니다. 여기

메신저가 그 일을하는 방법입니다

db.boxes.distinct("item_ids", {'_id' : {$in : [ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}}) 

첫째 그냥 궁금이 제정신 접근 방식처럼 보인다합니다. 내 연구에서 지금까지지도 축소가 큰 교차점에 대한 일반적인 제안 인 것처럼 보이지만 실시간 쿼리에는 권장되지 않습니다.

둘째, 이것이 샤르드 환경에서 어떻게 작동하는지 궁금하십니까? mongos가 mongod에 쿼리 쿼리를 실행하여 내 결과를 마술처럼 집계해야합니까?

위에서 제정신 경우

마지막으로, 또한 할 제정신 : 기본적으로 모든 객체로 구체화 한 후 상자 A와 상자 B 모두 공통점이있는 항목을 찾는 될 것

db.items.find({'_id' : { $in : db.eval(function() {return db.boxes.distinct("item_ids", {_id:{$in:[ObjectId("4d3dc3898951498107000005"), ObjectId("4d3dc3898951498107000002")]}}); }) }}) 

하나의 서버 측 쿼리에서. 이는 데이터 세트의 페이징을 효과적으로 구현하기 위해 .limit 및 .skip과 함께 작동하는 것으로 보입니다.

어쨌든 모든 피드백은 가치가 있습니다. 감사합니다!

+0

'별개'가 공통으로 값을 찾는 방법은 무엇입니까? "콜렉션에서 주어진 키의 고유 한 값 목록을 리턴합니다." Distinct에는 '교차점'기능이 없으며 A 또는 B에있는 모든 ID의 목록을 제공합니다. 또는 'union'을 의미합니까? –

+0

오우, 네, 맞아요. 나는 분명히 더 많은 커피가 필요하다. 나는이 질문을 삭제해야한다고 생각한다. 서버 측 어레이/세트 교차점에 대한 다른 아이디어가있는 경우를 대비하여 조금 남겨 둘 것입니다. 감사! – spotman

답변

3

여러분의 스키마를 다시 생각해보십시오. 배열에 ObjectID가 1,000,000 개 있고 각 배열이 12 바이트 인 경우 12MB입니다. BSON 오버 헤드를 계산하지 않아도됩니다. 큰 배열의 경우 * (아마도 다른 8MB 정도). 1.8에서 우리는 최대 문서 크기를 4MB에서 16MB로 높이고 있지만 저장하려고하는 객체에는 충분하지 않습니다.

* 역사적 이유로 우리는 < 요소가 100 개일 때 괜찮은 배열의 각 요소에 대해 stingified 인덱스를 저장하지만 6 또는 7 자리가 필요할 때 더합니다.

+0

예, 당신이 옳다고 생각합니다. 몽고의 특성과 함께 더 잘 작동 할 수있는 스키마의 아이디어? 나는 약간 mongo에 새롭다. 그리고 생산에서 아직 큰 아무것도 가지지 마라. 내가 고려한 한 가지 접근 방법은 아마도 어떤 항목이 어떤 상자에 들어 있는지, 즉 boxes_items 또는 무엇인가를 설명하는 문서를 갖는 것일 것입니다. 그러나 이것은 rdbms처럼 느껴지기 시작하고 많은 수의 작은 문서를 만들 것입니다. 그러나 Item과 Box는 모두이 애플리케이션의 일류 클래스이며, 둘 다 mongo의 스키마 유연성을 최대한으로 활용합니다. rdbms를 사용하면 역 추적과 같은 느낌이 듭니다. ( – spotman

+0

응용 프로그램에 대해 알지 못하면 스키마 조언을하기가 어렵습니다. [email protected]의 mongodb 메일 링리스트에 전자 메일을 보내는 것이 좋습니다. – mstearn