编辑3级mongo数据

我找不到第二级以上编辑嵌套数据的方法。 我有下一个模型结构:

var Category = new Schema({ name: String, url: String, id: String }); var Subgroup = new Schema({ name: String, url: String, id: String, categories: [Category] }); var Group = new Schema({ name: String, url: { type: String, default: '' }, subgroups: [Subgroup] }); module.exports = mongoose.model('group', Group); 

我需要通过组模型编辑某个类别。 我尝试所有可能的变化与嵌套数组工作,但没有结果。

 Group.findOneAndUpdate({ _id: req.params.groupId, "subgroups.categories._id": req.params.categoryId }, { $set: { "subgroups.categories.$.name": attributes.name } }); 

等等,如果你有categoryId, req.params.categoryId ,那么你可以像这样做更新:

 Category.findOneAndUpdate({ _id: req.params.categoryId }, {$set: {name: attributes.name}}) 

但是为了解决更新嵌套对象的根本问题,如果这是您想要执行的操作的types,我build议您稍微改变一下您的模式。 不用保存数组,你可以将关系存储到嵌套对象中的父对象,如下所示:

 var Group = new Schema({ name: String, url: {type: String, default: ''}, }) mongoose.model('Group', Group) var Subgroup = new Schema({ group: {type: ObjectId, ref: 'Group'}, name: String, url: String, id: String, }) mongoose.model('Subgroup', Subgroup) var Category = new Schema({ subgroup: {type: ObjectId, ref: 'Subgroup'}, name: String, url: String, id: String }) mongoose.model('Category', Category) 

现在您可以通过以下方式进行更新:

 Category.findAndUpdate({ subcategory: req.params.subcategoryId, }, ...) 

要么:

 Subgroup.find({ group: req.params.groupId, }, function(err, subgroups) { subgroups.forEach(function(subgroup) { Category.findAndUpdate({ subcategory: subgroup._id, }, ...) }) })