2012-09-21 5 views
0
에서 쿼리

당신은 특정 도시의 회사에 지난 10 개 의견을 선택해야합니다 컬렉션MongoDB. 3 개 개의 모음을

city: {"_id", "name"} 

company: {"_id", "name", "cityID"} 

comments: {"_id", "text", "companyID"} 

있다.

지금 나는 도시에있는 모든 회사의 첫 번째 _id 선택하고 10 코멘트 _id 에서 수신 여기에 코드입니다 :

$ db-> execute ('function() { 

var result = {}; 

var company = []; 
result.company = []; 
db.company.find ({"city": "msk"}, {"title": 1, "_id": 1}). forEach (function (a) { 
result.company [a._id] = Object.deepExtend (a, result [a._id]); 
company.push (a._id); 
}); 


var comments = []; 
result.comments = []; 
db.comments.find ({"company": {"$ in": company}}). sort ({"createTime": -1}). limit (10). forEach (function (a) { 
result.comments [a._id] = Object.deepExtend (a, result [a._id]); 
comments.push (a._id); 
}); 


return result; 

} '); 

ESTI의 더 나은 옵션은 내가 무엇을해야하는가? 미리 조언 해 주셔서 감사합니다.

+0

코드를 들여 쓰면 도움이 될 것입니다. – JohnnyHK

+0

[서버 측 JavaScript] (http://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-Using {{db.eval % 28 % 29)를 사용하지 말 것을 권합니다. }}) (이 링크는주의 사항 및 고려 사항으로 채워짐). 'MongoCollection :: find()'로 첫 번째 쿼리를 발행하고, PHP에서 회사 ID의 배열을 구축 한 다음 두 번째 쿼리를 발행 할 이유가 없습니다. – jmikola

+0

JavaScript보다 서버 인 PHP에서 더 나은 이유는 무엇입니까? – jeka5555

답변

0

현재 코드

db.comments 
    .find({"company": {"$in": company}}) 
    .sort({"createTime": -1}) 
    .limit(10) 

만이 아니라 각 회사의 지난 10보다, 지정된 도시에 대한 전반적인 지난 10 개 의견을 가져 오는 있습니다. 이게 니가 원하는거야? 그렇다면 각 주석에 "도시"필드를 저장하고 도시를 기반으로하는 주석 컬렉션을 쿼리하면됩니다.

각 회사마다 10 개를 유지하려면 현재 스키마를 사용하여 각 관련 회사의 의견 모음에 대해 개별 쿼리를 작성해야합니다.

데이터의 사용 사례는 무엇입니까?

편집 : 관계형 데이터베이스 모델에서

, 당신은 하나 개의 쿼리 당신에게 두 테이블 (회사 및 댓글)에서 정보를 얻을 것 가입 쿼리를 실행할 수있을 것입니다. 그러나 MongoDB는 조인을 지원하지 않으므로 단일 쿼리에서 필요한 정보를 가져올 수 있도록하려면 주석 필드에 도시 ​​필드를 저장하여 데이터를 비정규 화해야합니다.

+0

가장 최근의 코멘트가 도시에 있습니다. 나는 그것이 코멘트에 도시를 추가 할 것이라고 생각했다. 그러나 그것은 동일하다 - 비정규 화. 이 경우 kokrutnom이 정상적인 것일 수 있지만, 상황과 잘 연결된 데이터가있을 수 있습니다. 방법은 없지만 모든 이드를 가져다가 $ in을 사용합니까? – jeka5555

+0

스키마가 설정된 방식이 아닙니다. 회사가 변화하고있는 도시는 매우 희박한 것 같아 도시를 논평에 포함시키는 것은 정상화의 허용 가능한 위반이라고 생각합니다. – shelman

+0

원래 답변을 수정하십시오. – shelman