2014-03-28 3 views
0

단일 참조 배열에서 여러 유형의 복수 ObjectId을 어떻게 참조 할 수 있습니까? Address, AddressRange 또는 AddressList의 숫자들로 구성 될 수있다몽구스에 다른 유형의 객체를 저장하십시오.

var Schema = mongoose.Schema; 

var AddressSchema = new Schema({ 
    value: String 
}); 

var AddressRangeSchema = new Schema({ 
    from: String, 
    to: String 
}); 

var AddressListSchema = new Schema({ 
    name: String, 
    list: [Schema.Types.ObjectId] 
}); 

AddressList.list :

아래의 간단한 스키마를 감안할 때.

var firstAddr = new Address({ 
    value: "172.0.0.1" 
}); 

var firstAddrRange = new AddressRange({ 
    from: "172.0.0.10", 
    to: "172.0.0.20" 
}) 

var firstList = new AddressList({ 
    name: "MyFirstList", 
    list: [ 
    firstAddr.id, 
    firstAddrRange.id 
    ] 
}); 

가 어떻게이 list 배열의 객체를 당길 수, 그들은 세 가지 유형 중 하나입니다 주어진 : 다음과 같은?

답변

0

Mongodb에서는 한 번에 하나의 컬렉션 만 쿼리 할 수 ​​있습니다. 몽구스 (Mongoose)와 같은 ORM 계층이이를 추상화 할 수 있지만 궁극적으로 각 컬렉션에 대해 별도의 쿼리를 수행하고 있습니다.

목록에있는 항목의 순서가 중요하지 않은 경우이 전체 작업이 훨씬 간단 해집니다. 주문이 중요하면 더 많은 일을해야합니다.

옵션 1) 각 컬렉션에 대해 ID를 모두 쿼리하십시오. 최대 16MB까지 전달할 수 있습니다! 가치가 $ 인 쿼리로 인해 상당량의 ID가 필요하므로 거대한 콜렉션에서도 작동합니다.

AddressSchema.find({_id:{$in:allIds} }, callback); 
AddressRangeSchema.find({_id:{$in:allIds} }, callback); 

이렇게하면 모든 항목이 제공되고 수동으로 통과하여 올바른 순서로 병합 할 수 있습니다. 작은 항목 세트 (100 미만)의 경우 이것은 아마도 끔찍한 옵션이 아닙니다. _id 필드에서 인덱싱을하므로 캐시 히트 및 누락이 매우 저렴합니다.

옵션 2) 컬렉션을 나타내는 _id와 함께 메타 데이터를 저장 : 그런 다음 제대로 각 모음의 쿼리를 수행 할 수

var AddressListSchema = new Schema({ 
    name: String, 
    list: [{type:String, _id: Schema.Types.ObjectId}] 
}); 

var firstList = new AddressList({ 
    name: "MyFirstList", 
    list: [ 
    {type:'a', _id: firstAddr.id}, 
    {type:'ar',_id: firstAddrRange.id} 
    ] 
}); 

. 이렇게하면 캐시 누락이 줄어들지 만 AddressList 컬렉션에 저장된 데이터의 크기가 증가합니다. 이 패턴은 캐시하거나 부분보기에 표시 할 이름 또는 다른 필드가있는 경우 특히 유용합니다.

옵션 3) 둥지에 사용 사례에

확실하지의 모든 데이터 스키마를 변경하지만 가장 좋은 방법이 될 수 있습니다 별도의 세 가지 컬렉션을하는 대신 스키마를 중첩.

관련 문제