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

Cha*_*nce 6 mongoose mongodb node.js

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

此外,我很难找到有关如何基于嵌套文档查找的信息.在这种情况下,是否有可能做我希望的事情,或者我应该扩展我的域结构并拥有"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'});
Run Code Online (Sandbox Code Playgroud)

机构:

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}
});
Run Code Online (Sandbox Code Playgroud)

Ram*_*Vel 11

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

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

幸运的是,版本2.0在一周前发布.而且稳定.有关详细信息,请查看链接2.0发行说明.

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

它必须从mongodb shell这样做

   db.Agency.ensureIndex({"Address.location": 2d})
Run Code Online (Sandbox Code Playgroud)

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

  AgencySchema.index({'Address.location': '2d'});
Run Code Online (Sandbox Code Playgroud)

查看mongodb索引了解更多信息