【问题标题】:Mongodb document saving don't work with nested SchemaMongodb文档保存不适用于嵌套架构
【发布时间】:2018-10-25 22:43:50
【问题描述】:

我有一个具有不同架构的简单 Nodejs/Mongodb 项目,但是当我尝试更新嵌套文档中的属性时,mongodb 不会更新数据库。

架构组:

const GroupSchema = new Schema({
    settings: {
        type: Schema.ObjectId,
        ref: 'groupSettings',
        required: true,
    }
});

const Group = mongoose.model('groups', GroupSchema);

架构组设置:

const GroupSettingSchema = new Schema({
currency: {
    type: String,
    required: true,
    default:'cad'
},
});

const GroupSetting = mongoose.model('groupSettings', GroupSettingSchema);

Express.js 路由函数:

let group = await Group.findById(id).populate('settings').exec()
    .catch(err => {
        return sendError(res, DatabaseFindError, err)
    })

if (!group) {
    return sendError(res, NotFoundError)
}

//HERE group.settings == old value

//change property send by the body
Object.keys(req.body.settings).forEach(key => {
    let value = req.body.settings[key];
    if (isDefined(group.settings[key])) {
        //only modify if keys exist
        //THIS WORK
        group.settings.set(key, value);

    }
});

 //HERE group.settings == new value

 await group.save()//DB IS NEVER UPDATED
    .catch(err => {
        return sendError(res, DatabaseSaveError, err)
    })

return sendSuccess(res, {
    settings: group.settings// THIS RETURN NEW VALUE
})

Mongoose DB 调试模式真实日志:

Mongoose: users.findOne({ _id: ObjectId("5bc4e6e2f37badaaeaa1ef9d") }, { projection: {} })
Mongoose: groups.findOne({ _id: ObjectId("5bca88c9ec9c9583c7bf0c86") }, { projection: {} })
Mongoose: groupsettings.find({ _id: { '$in': [ ObjectId("5bca88c8ec9c9583c7bf0c82") ] } }, { projection: {} })

::ffff:127.0.0.1 - - [22/Oct/2018:17:18:18 +0000] "POST /api/groups/5bca88c9ec9c9583c7bf0c86/modify/settings HTTP/1.1" 200 63 "http://localhost:3000/admin/groups/5bca88c9ec9c9583c7bf0c86/settings" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

所以 Mongoose 甚至不执行 .save 吗?

为什么?

谢谢,如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • Populate 应该使用exec: await Group.findById(id).populate('settings').exec() 来真正给你一个真正的Promise
  • 没错,我会改变的。谢谢 .save() 仍然不起作用...

标签: node.js mongodb express mongoose


【解决方案1】:

对于遇到此问题的任何人,您需要在组保存后自行保存设置:

await group.settings.save()//DB IS NOW UPDATED
    .catch(err => {
        return sendError(res, DatabaseSaveError, err)
    })

之后:

await group.save()//DB IS NEVER UPDATED
    .catch(err => {
        return sendError(res, DatabaseSaveError, err)
    })

谢谢

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 2018-06-30
    • 2021-05-06
    • 1970-01-01
    • 2018-05-26
    • 2014-03-04
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多