更新mongoose子文档会修改原始模式

时间:2016-06-03 14:55:25

标签: node.js mongodb mongoose subdocument

我正在尝试将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]

1 个答案:

答案 0 :(得分:0)

我认为这就是你想要的(使用你的上一个例子):

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

type在Mongoose中被“保留”;如果您需要使用该名称创建属性,则需要使用typeKey告诉Mongoose它应该使用另一个标识符来声明属性的类型(在此示例中为$type)。

解释here,包括对GeoJSON用法的引用。