2011-09-18 96 views
6

我有以下模式;地址是經過地理編碼的地點,機構有許多地址。我的問題是,如果我希望能夠根據地址對代理機構執行地理空間搜索,那麼我是否需要以代理級別對其進行索引(已在地址架構級別進行了索引)?可以/應該在Mongoose中索引嵌入式文檔嗎?

此外,我很難找到有關如何找到基於嵌套文件的信息。在這種情況下,甚至有可能做我希望的或者我應該擴大我的域名結構,並有一個「AgencyAddress」?這種方法對我來說似乎有點RDBMS,但我也可以看到它的優點。

我對如何使用來自Agency(或橋對象AgencyAddress)的ObjectId refs沒有從地址返回的反向鏈接有點困惑。我不想擁有反向鏈接,因爲地址將被應用程序中的許多其他對象使用。

謝謝!

var AddressSchema = new Schema({ 
    name  : {type: String, default : ''}, 
    street1  : {type: String, default : ''}, 
    street2  : {type: String, default : ''}, 
    city  : {type: String, default : '', required: true}, 
    state  : {type: String, required : true}, 
    zip   : {type: String, default ''}, 
    country  : {type: String}, 
    location : {longitude: Number, latitude:Number} 
    type  : {type: String, enum:['agent', 'agency', 'registrant'], index:true} 
    created_at : {type: Date, default: Date.now}, 
    updated_at : {type: Date, default: Date.now} 
    primary  : {type: Boolean, default: false} 
}); 

AddressSchema.index({location: '2d'}); 

局:

var AgencySchema = new Schema({ 
    name   : {type : String, default : '', required : true}, 
    Type   : {type : String, enum['medical', 'disaster-service', 'local-law', 'state-law', 'federal-law'], index:true}, 
    Addresses : [Address], 
    created_at : {type : Date, default : Date.now}, 
    updated_at : {type : Date, default : Date.now} 
}); 

回答

11

我沒有與貓鼬的經驗,所以我可以在一般的解釋MongoDB的索引。從你的問題我明白,多個Address地理編碼文檔嵌入到代理。

如果您使用的是mongodb版本< = 1.8,則無法索引嵌套的地理編碼文檔。但是該功能是從版本1.9開始添加的。我已經成功使用了幾個月的相同類型的模式。但它是一個發展(不穩定)分支。

幸運的是2.0版在一週前發佈。而它的穩定。查看鏈接2.0 Release Notes瞭解更多信息。

而且你不能直接在嵌入式文檔上索引。

它做這樣的mongodb從外殼

db.Agency.ensureIndex({"Address.location": 2d}) 

我不知道貓鼬確切的語法,可能是這樣的

AgencySchema.index({'Address.location': '2d'}); 

退房的mongodb indexing更多信息

+0

啊,那是完美的人。謝謝。 – Chance

+0

這對我來說並不完美。是否真的需要在mongo控制檯中創建索引? – Greg

+1

@Greg「是否真的需要在mongo控制檯中創建索引」,完全沒有,您可以通過您使用的任何語言驅動程序來做到這一點,我從控制檯上說,因爲我沒有任何經驗與貓鼬 – RameshVel

相關問題