Обновление поддокумента мангуста изменяет исходную схему

Я пытаюсь сохранить location парковки Spot в одном встроенном поддокументе для более чистой объектной модели. Я хочу, чтобы coordinates из location для Spot по умолчанию равнялось [] для каждого нового Spot.

Когда я создаю Схему следующим образом:

var LocationSchema = new Schema({
  Coordinates: {
    type: [Number],
    index: '2dsphere'
  }
})

затем вставьте эту Схему как вложенный документ в Spot:

var SpotSchema = new Schema({
  location: {
    type: LocationSchema,
    default: LocationSchema
  }
})

var Spot = mongoose.model('Spot', SpotSchema')

а затем создайте экземпляр Spot и попробуйте установить для него coordinates какое-то значение, например [12, 34]:

var spot = new Spot()
spot.location.coordinates = [12, 34]

каждый новый Spot, который я создаю с тех пор, имеет координаты по умолчанию для этого значения:

var anotherSpot = new Spot()
anotherSpot.location.coordinates //returns [12, 34]

Что я делаю не так? Я не понимаю, почему изменение свойства экземпляра изменит исходную модель и, соответственно, каждый новый экземпляр, созданный на ее основе.

РЕДАКТИРОВАТЬ

Точно такая же проблема возникает даже без использования вложенного документа:

var SpotSchema = new Schema({
    location: {
        type: {
            coordinates: [Number],
            index: '2dsphere'    
        },
        default: {
            coordinates: []
        }
    }
 })

var Spot = mongoose.model('Spot', SpotSchema')

var spot = new Spot()
spot.location.coordinates = [12, 34]
var anotherSpot = new Spot()
anotherSpot.location.coordinates //returns [12, 34]

person Nigh7Sh4de    schedule 03.06.2016    source источник


Ответы (1)


Я думаю, это то, что вы хотите (используя ваш последний пример):

var SpotSchema = new Schema({
    location: {
      type        : String,
      coordinates : { 
        $type   : [ Number ],
        default : [],
        index   : '2dsphere'
      },
    }
 }, { typeKey : '$type' })

type "зарезервирован" в Mongoose; если вам нужно создать свойства с этим именем, вам нужно использовать typeKey, чтобы сообщить Mongoose, что он должен использовать другой идентификатор для объявления типа свойства (в этом примере, $type).

Объяснение здесь, включая ссылку на использование GeoJSON.

person robertklep    schedule 03.06.2016
comment
Я пробовал это, и это не работает, spot.location.coordinates это undefined - person Nigh7Sh4de; 03.06.2016
comment
Я думаю, что [] не может быть допустимым значением по умолчанию. - person robertklep; 03.06.2016
comment
(точнее, тот, который не имеет смысла в сочетании с index : '2dsphere', поэтому Mongoose его не заполнит) - person robertklep; 03.06.2016
comment
Не могли бы вы объяснить мне / указать мне на статью, которая объяснила бы, почему это значение по умолчанию не имеет смысла? Кажется, мои навыки работы с google не на должном уровне, потому что я искал дополнительную информацию об использовании mongoose indexs и geoJSON в mongoose, и, очевидно, я все еще недостаточно знаю, чтобы их использовать. - person Nigh7Sh4de; 03.06.2016
comment
Если вы удалите объявление индекса, Mongoose будет заполнять массив координат, поэтому я думаю, что для Mongoose нет смысла по умолчанию использовать пустой массив :-) MongoDB не будет индексировать документы GeoJSON с пустым или null координаты (задокументировано здесь), возможно, это связано с этим также. - person robertklep; 03.06.2016
comment
Да, это должно быть ограничение, которое мангуст накладывает на индексированный объект, чтобы не допускать пустых массивов, поэтому значение по умолчанию не работает. - person Nigh7Sh4de; 06.06.2016