29

MongoDB 2.4 允许使用GeoJSON对象以及我想使用的一系列简洁的函数和索引。

它期望 GeoJSON 对象以如下格式存储:

loc: {
  type: 'Polygon',
  coordinates: [[[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]]
}

因此,在 Mongoose 中,人们会认为架构的定义如下:

loc: { type: 'string', coordinates: [[['number']]] }

但这会带来两个问题:

  1. 拥有一个名为“type”的字段会破坏 Mongoose 的模式解析,因为它允许在表单字段中定义字段:{ type: , index: } 等。

  2. Mongoose 不喜欢嵌套数组。

克服这个问题的一种方法是简单地使用mongoose.Schema.Types.Mixed,但是我觉得必须有更好的方法!

4

5 回答 5

49

供参考,Mongoose 3.6 正式支持 GeoJSON

请参阅此处的发行说明

示例(来自文档):

new Schema({ loc: { type: [Number], index: '2dsphere'}})

... 然后 ...

var geojsonPoly = { type: 'Polygon', coordinates: [[[-5,-5], ['-5',5], [5,5], [5,-5],[-5,'-5']]] }

Model.find({ loc: { $within: { $geometry: geojsonPoly }}})
// or
Model.where('loc').within.geometry(geojsonPoly)
于 2013-03-30T03:04:30.573 回答
15

您必须使用 Mixed 来表示数组的数组。将来有一张公开票可以支持这一点。

@nevi_me 是正确的,您必须type按照他的描述声明该属性。

这是一个要点:https ://gist.github.com/aheckmann/5241574

有关更多想法,请参阅此处的猫鼬测试:https ://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931

于 2013-03-25T22:50:39.067 回答
5

创建mongoose -geojson-schema包是为了方便在 Mongoose Schemas 中使用 GeoJSON。

于 2016-05-06T14:47:34.940 回答
5

Mongoose 现在正式支持这一点

简而言之,您所做的是,对于该模式,您使用该typeKey设置来告诉 mongoose 使用不同的键来获取类型信息。这是一个例子:

var schema = new Schema({
  // Mongoose interpets this as 'loc is an object with 2 keys, type and coordinates'
  loc: { type: String, coordinates: [Number] },
  // Mongoose interprets this as 'name is a String'
  name: { $type: String }
}, { typeKey: '$type' }); // A '$type' key means this object is a type declaration

因此,现在您无需使用属性声明类型信息type,而是使用$type. 这适用于模式级别,因此在需要它的模式中使用它。

于 2016-11-27T15:22:58.907 回答
4

我即将开始将我在 MongoDB 中的所有位置引用从'2d'GeoJSON 移动,所以我会遇到同样的问题。

  • 关于这个type问题,您必须按照我在下面所做的操作才能使其正常工作。Mongoose 正确地将其识别为字符串。
  • 嵌套数组;我同意这mongoose.Schema.Types.Mixed会奏效,但我认为您可以尝试我在下面所做的,让我知道它是否有效。我不在安装了 mongo 的 PC 附近来尝试模式。

这是我定义架构的方式。可以调整嵌套数组以使其正常工作,所以如果不能,请告诉我。

var LocationObject = new Schema ({
  'type': {
    type: String,
    required: true,
    enum: ['Point', 'LineString', 'Polygon'],
    default: 'Point'
  },
  coordinates: [
    [
      { type: [ Number ]
    ]
  ]
});

如果您在 的嵌套中得到不希望的结果Array,请改用此方法。基本上嵌套更深。

coordinates: [
  { type: [
    { type: [ Number ] }
  ] }
]
于 2013-03-22T12:41:20.950 回答