可以/我应该在Mongoose中索引嵌入文档吗?

时间:2011-09-18 17:56:06

标签: mongodb node.js mongoose

我有以下架构;地址是一个地理编码的位置,代理商有许多地址。我的问题是,如果我希望能够根据其地址对代理商执行地理空间搜索,那么我是否需要以某种方式在代理商级别对其进行索引(已在地址架构级别编制索引)?

另外,我很难找到有关如何根据嵌套文档查找的信息。在这种情况下,是否有可能做我希望的事情,或者我应该扩展我的域结构并拥有“AgencyAddress”?这种方法对我来说似乎有点RDBMS,但我也可以看到它的优点。

我对如何使用来自Agency(或桥接对象AgencyAddress)的ObjectId引用而没有从地址返回的反向链接感到有点困惑。我不希望有回链接,因为地址将被应用程序中的许多其他对象使用。

谢谢!

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}
});

1 个答案:

答案 0 :(得分:11)

我没有使用猫鼬的经验,所以我可以解释一般的mongodb索引。根据您的问题,我了解多个Address地理编码文档已嵌入代理商。

如果您使用的是mongodb版本< = 1.8,则无法索引嵌套的地理编码文档。但该功能是从1.9版本添加的。我已经成功使用了几个月的同一种模式。但它是一个发展(不稳定)分支。

幸运的是,版本2.0在一周前发布。而且稳定。查看链接2.0 Release Notes了解详情。

并且您无法直接在嵌入式文档上编制索引。

必须从mongodb shell

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

我不知道mongoose的确切语法,可能就像这样

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

查看mongodb indexing了解详情