节点,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() 保存 - 给出内部服务器错误

我无法使用 Mongoose 在 MongoDB 中保存或查找文档

Mongoose GeoJSON 在使用中间件时抛出“MongoError:无法提取地理键”