节点,js - Mongoose - 无法保存地理多边形 - CastError: Cast to number failed
Posted
技术标签:
【中文标题】节点,js - Mongoose - 无法保存地理多边形 - CastError: Cast to number failed【英文标题】:Node,js - Mongoose - Unable to save Geo Polygon - CastError: Cast to number failed 【发布时间】:2014-01-10 19:22:12 【问题描述】:我正在尝试将地理点和地理多边形保存到 Mongo。我的点测试通过了,但多边形失败了:
CastError: 路径“坐标”处值“0,0,3,0,3,3,0,3,0,0”的数字转换失败
我的架构如下:
var GeoSchema = new Schema(
name: String
, coordinates: [Number]
);
GeoSchema.index( coordinates: '2dsphere' );
我成功保存的测试点对象:
geoPoint = new Geo(
coordinates: [2,2],
type: 'Point'
);
我的测试多边形对象保存失败:
geoPolygon = new Geo(
type: 'Polygon',
coordinates: [[ [0,0], [3,0], [3,3], [0,3], [0,0] ]]
);
我尝试将“坐标”的类型 def 更改为对象和数组,但都无法保存。
谁能给点建议?
* 更新 *
我现在可以使用:
架构:
var GeoSchema = new Schema(
coordinates : type: [], index: '2dsphere' ,
type: String
);
点对象:
geoPoint = new Geo(
geo:
type: 'Point',
coordinates: [2,2]
);
多边形:
geoPolygon = new Geo(
geo:
type: 'Polygon',
coordinates: [
[ [100.0, 0.0], [101.0, 0.0],
[101.0, 1.0], [100.0, 1.0],
[100.0, 0.0] ]
]
);
但是,当我直接查询数据库时,我只看到:
db.geos.find()
"_id" : ObjectId("52b73de00b4dfee427000005"), "__v" : 0
"_id" : ObjectId("52b73de00b4dfee427000006"), "__v" : 0
谁能告诉我为什么我看不到保存的记录?
【问题讨论】:
坐标怎么样:[]? 你如何看待多边形上的索引? 设置坐标:[] 给出:MongoError: Can't extract geo keys from object, malformed geometry?: 0: [ [ 0, 0 ], [ 3, 0 ], [ 3, 3 ], [ 0, 3 ], [ 0, 0 ] ] 我不确定,2dsphere 表示坐标是 [long, lat] 【参考方案1】:编辑: 看来我们只能在 Point 上设置 2dsphere,而不是 Polygon
所以我删除了索引并且它起作用了。
文件:app.js
var mongoose = require('mongoose');
mongoose.connect('localhost', 'geo-database');
var GeoSchema = mongoose.Schema(
name: String
, coordinates: []
);
//GeoSchema.index( coordinates: '2dsphere' );
var Geo = mongoose.model('geos', GeoSchema);
Geo.on('index', function ()
function cb()
console.log(arguments);
geoPoint = new Geo(
coordinates: [2,2],
type: 'Point'
).save(cb);
geoPolygon = new Geo(
type: 'Polygon',
coordinates: [[ [0,0], [3,0], [3,3], [0,3], [0,0] ]]
).save(cb);
)
终端:
$mongo --version
MongoDB shell version: 2.5.5-pre-
npm install mongoose
node app
输出:
'0': null,
'1': __v: 0, _id: 52b6e82493d21060b3000001, coordinates: [ 2, 2 ] ,
'2': 1
'0': null,
'1':
__v: 0,
_id: 52b6e82493d21060b3000002,
coordinates: [ [ [Object], [Object], [Object], [Object], [Object] ] ] ,
'2': 1
【讨论】:
据此 - mongodb.info/2013/05/21/… 2dsphere 确实支持多边形。试图弄清楚为什么你的测试有效而我的失败。发现问题后会更新。我现在的猜测是我的多边形 json 格式。 确实如此。 2dsphere 确实支持多边形,但 mongoose 似乎对这种数据类型有问题。以上是关于节点,js - Mongoose - 无法保存地理多边形 - CastError: Cast to number failed的主要内容,如果未能解决你的问题,请参考以下文章
Nest.js/Mongoose:为啥我的预保存钩子无法触发?
使用 Mongoose.js 保存模型时,为啥会出现“无法调用未定义的 doValidate”?
使用 Mongoose.js 保存模型时,为啥会出现“无法调用未定义的 doValidate”?
无法使用 mongoose Model.save() 保存 - 给出内部服务器错误