2014-10-09 3 views
1

У меня есть следующая схема Mongoose, представляющий движущийся объектMongoose схема обновления в формате GeoJSON

var vehicleSchema = new Schema({ 
    properties:{ 
     obj:String, 
     name:String, 
     id:String 
    }, 
    geometry : { 
     type: {type : String}, 
     coordinates : [ Number, Number ] 
    } 
}); 

и я пытаюсь обновить его с помощью следующего объекта и команды, которые работают без сбоев, если я вхожу в Монго консоли, но не обновляется документ при использовании в функции узла.

Это объект, который будет обновлен:

var updatedVehicle = new Vehicle(
    {properties:{ 
     obj:"Answer", 
     name:"is", 
     id:"42" 
    }, 
    geometry:{ 
     type:"Point", 
     coordinates:[42,42] 
    } 
}) 

И это команда обновление

Vehicle.update(
    {$and:[ 
     {'properties.obj':data.properties.obj}, 
     {'properties.id':data.properties.id} 
    ]}, 
    {$set: 
     {properties:data.properties, geometry:data.geometry} 
    }, 
    {upsert: true}, 
    cb 
) 

Я знаю, что Mongoose имеет некоторые quirks when it comes to GeoJSON, и я надеюсь, что это просто еще один.

ответ

2

Ваше свойство геометрии схемы нужно просто установить в массив чисел для хранения координат, например, так:

geometry : { 
    type: [Number], 
    index: '2dsphere` //some geospatial queries require this 
} 

, а затем запрашивать и обновлять как таковой

{ $set: { geometry: data.geometry.coordinates } } 
+0

Но не что отклоняться от формата GeoJSON? На основе этого формата поле типа хранится в типе. – Dimitris

+1

@Dimitris Я не смотрел спецификацию GeoJSON, но mongo не требует установки свойства type, ведь схема - это просто абстракция мангуста, она не отражается на мангусте, за исключением определенных случаев, таких как 'index'. Однако он требует указать тип при выполнении геопространственного запроса, как показано здесь. Http://docs.mongodb.org/manual/tutorial/query-a-2dsphere-index/ – Jakeii

+0

Итак, я понимаю, что мне не нужно беспокоиться о схеме, пока я индексирован геометрия и использую этот тип при выполнении геопространственных запросов. Это означает, что я могу создать новый объект только с геометрией: [x, y], index: '2dsphere'} Кстати, я предпочитаю использовать «testV.index ({'geometry': '2dsphere'}) ;» один раз в схеме, чем добавление его к каждому новому объекту. Я сделаю некоторое тестирование и вернусь. ; - – Dimitris

Смежные вопросы