猫鼬有时将objectId保存为字符串,有时不保存

时间:2019-01-30 10:03:57

标签: mongodb mongoose

有时猫鼬将“ main_id”保存为字符串而不是ObjectId,保存后,我在mongoshell和UI客户端中看到字符串类型。

猫鼬:4.11.0

我有模式:

var building = new Schema({
    location: {
        main_id: { type: Schema.Types.ObjectId,  ref: 'locations'},
        title: {type: String},
        description: {type: String}
    },
    year: {type: Number}
});

var User = new Schema({    
    my_location: {
        now: building,
        more: [building]
    }
})

当下面的代码运行时,有时我在DB中得到字符串,而不是objectId。

user.my_location.more[i].location.main_id = new mongoose.Types.ObjectId("584fe811ed936fe74d8b470e")
user.save()

当我在保存后检查typeof user.my_location.more[i].location.main_id时说“对象”,但在数据库中显示字符串:),当我在带有ObjectId的mongoDB中运行查询时,找不到此更新的文档

1 个答案:

答案 0 :(得分:0)

强迫猫鼬保存一些东西 (解决了我的“有时”问题)

当我为变量猫鼬设置类似字段的值时,会检查架构的更改并仅更新它们(据我从文档中了解),但是猫鼬不会检查嵌套数组的更改。

因此,我们有两个本地技巧:

  1. 强制告诉猫鼬哪个字段被修改

    user.markModified('my_location.more') user.save() //Now all good

  2. 通过set

    更改数组元素的值

    user.my_location.more[i].location.main_id = new mongoose.Types.ObjectId("584fe811ed936fe74d8b470e") user.my_location.more[i].year = 2019 user.my_location.set(i, user.my_location.more) //To set whole changed object user.save()