2011-09-18 72 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

相关问题