Node, js - Mongoose - Невозможно сохранить геополигон - CastError: преобразование в число не выполнено

Я пытаюсь сохранить Geo Point и Geo Polygon в Mongo. Мои тесты проходят для Point, но не проходят для многоугольника:

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 }

Может кто посоветует, почему я не вижу сохраненные записи?


person Ben    schedule 22.12.2013    source источник
comment
как насчет координат: []?   -  person damphat    schedule 22.12.2013
comment
а как вы относитесь к индексу на многоугольнике?   -  person damphat    schedule 22.12.2013
comment
Установка cordinates: [] дает: MongoError: Невозможно извлечь географические ключи из объекта, неверная геометрия?: {0: [[0, 0], [3, 0], [3, 3], [0, 3], [0, 0]]}   -  person Ben    schedule 22.12.2013
comment
Я не уверен, 2dsphere означает, что кординаты [долгота, широта]   -  person damphat    schedule 22.12.2013


Ответы (1)


Изменить: кажется, что мы можем установить 2dsphere только на Point, а не на 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 }
person damphat    schedule 22.12.2013
comment
Согласно этому - mongodb .info / 2013/05/21 / 2dsphere поддерживает многоугольники. Пытаюсь понять, почему ваш тест работает, а мой - нет. Будет обновлено, как только я обнаружу проблему. Я предполагаю, что теперь это мой многоугольный формат json. - person Ben; 22.12.2013
comment
Это правда. 2dsphere поддерживает Polygon, но mongoose, похоже, ошибается с этим типом данных. - person Phillipe Gustavo; 21.07.2014