2013-09-02 3 views
0

MongoDB의 newby입니다. 일부 문서 컬렉션의 링크 된 문서를 쿼리 할 때 문제가 있습니다. 내가 지정된 태그에 해당 링크의 수를 얻을 필요가링크 된 문서에 대한 조건에 따라 문서를 찾는 방법

var tagScheme = Schema({ 
    name: { type: String, required: true } 
}); 
tagScheme.index({ name: 1 }, { unique: true }); 


var linkScheme = Schema({ 
    name: { type: String }, 
    tags: [{ type: Schema.Types.ObjectId, ref: 'Tag' }] 
}); 
linkScheme.index({ name: 1 }, { unique: true }); 

:

여기 내 데이터베이스 방식이다. 다음 쿼리를 실행하려고합니다 :

dbschemes.Link.find({ 'tags.name': specifiedTagName }, function (err, links) { 
    return res.send(500, err); 
    alert(links.length); 
}); 

이 쿼리는 제대로 작동하지 않습니다. 항상 빈 링크 목록을 반환합니다. 문제가 무엇인지 누군가가 내게 exlain 할 수 있습니까?

+2

MongoDB는 조인을 지원하지 않으므로 쿼리하는 컬렉션의 필드 만 참조 할 수 있습니다. – JohnnyHK

답변

0

JohnnyHK가 주석을 달았으므로, 수행하려는 쿼리 유형은 관계형 쿼리이고 mongodb와 같은 문서 데이터베이스는이를 지원하지 않습니다. 링크 스키마에 직접 (중첩 또는이 경우에는 확인하는 관계형 관점에서 "역 정규화를") 그 태그 데이터를 넣어 스키마를 수정, 당신은 그것을 조회 할 수 있습니다 : 그 스키마와

var LinkSchema = new Schema({ 
    name: String, 
    tags: [String] 
}); 

, 당신의 쿼리가 예상대로 작동합니다.

아래의 의견에 답변하십시오. 이것은 문서 데이터베이스입니다. 그것은 관계가 아닙니다. 트레이드 오프가 있습니다. 데이터가 비정규 화되고 확장 성 및 성능을 제공하며 쿼리 및 데이터 일관성의 유연성을 통해 데이터를 가져옵니다. 상대적으로 희귀 한 태그의 이름을 바꾸려면 단일 업데이트 명령이있는 관계와 달리 무려 2 개의 데이터베이스 명령 (새 이름의 $ 푸시, 이전 이름의 $ 당기기)을 수행해야합니다. 그것을 할 것입니다.

+0

고마워요, 피터. 그러나이 방법은 한 가지 단점이 있다고 생각합니다. TagScheme의 태그 이름을 업데이트해야한다면 항상 LinkScheme의 태그 이름을 업데이트해야한다는 점을 기억해야합니다. 이 문제를 해결하는 방법? – Dmitriy

+0

나는 Peters 예제에서 linkschema 안에 태그를 삽입하기 위해 tagSchema를 모두 제거했다고 생각합니다. 즉, 링크 사이의 태그는 관계가 없거나 괜찮을 수도 있습니다. 여러 링크에 동일한 태그가 있고 태그를 변경하려는 경우 잘 변경하면 모두 변경해야합니다. 즉 그것이 작동하는 방식입니다. – Todilo

관련 문제