Mongoose如何匹配嵌套数组子Schema字段并更新对应属性
问题原因与解决方案
错误原因
- Schema仅用于定义数据结构,本身不具备数据库操作能力,只有将Schema编译为Mongoose Model后才能调用
updateOne等操作方法 parentSchema上不存在childSchema属性,你只是将childSchema作为nested字段的数组元素类型,因此parentSchema.childSchema取值为undefined,调用其updateOne方法会抛出类型错误
正确实现步骤
- 先将父Schema编译为Model:
const ParentModel = mongoose.model('Parent', parentSchema)
- 直接用Model调用更新方法即可,你原本的匹配规则和更新字段写法是正确的,仅需要调整调用主体:
// 全局匹配所有父文档中第一个符合foo2条件的嵌套项,更新其bar2字段 ParentModel.updateOne( { 'nested.foo2': 'string-that-matches' }, { $set: { 'nested.$.bar2': 'new-string-for-bar2' } } ) // 若要更新指定父文档内的匹配嵌套项,需额外添加父文档匹配条件,例如按_id筛选父文档: ParentModel.updateOne( { _id: '目标父文档的_id', 'nested.foo2': 'string-that-matches' }, { $set: { 'nested.$.bar2': 'new-string-for-bar2' } } )
扩展场景
如果需要更新同一个父文档内所有匹配foo2条件的嵌套项,可使用数组筛选标识符搭配arrayFilters参数实现:
ParentModel.updateOne( { _id: '目标父文档的_id' }, { $set: { 'nested.$[elem].bar2': 'new-string-for-bar2' } }, { arrayFilters: [ { 'elem.foo2': 'string-that-matches' } ] } )
内容的提问来源于stack exchange,提问作者PKPython
相关产品推荐
相关产品推荐

