如何在Mongoose Schema中表示MongoDB GeoJSON字段?

时间:2013-03-21 19:44:28

标签: mongodb schema mongoose geospatial geojson

MongoDB 2.4允许使用我想使用的GeoJSON个对象和一些neat functions and indexes

它希望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不喜欢嵌套数组。

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

5 个答案:

答案 0 :(得分:46)

作为参考,Mongoose 3.6正式支持GeoJSON

See the release notes here

示例(来自文档):

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)

答案 1 :(得分:15)

您必须使用Mixed来表示数组数组。将来有open ticket来支持这一点。

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

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

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

答案 2 :(得分:5)

创建了mongoose-geojson-schema包,以便在Mongoose Schema中轻松使用GeoJSON。

答案 3 :(得分: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 ] }
  ] }
]

答案 4 :(得分:4)

Mongoose现在officially supports this

简而言之,您所做的是,对于该架构,您使用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。这适用于模式级别,因此在需要它的模式中使用它。