我在尝试通过其id而不使用其父ID来选择数组元素时遇到问题。因此,以下面的示例为例,我想选择_id为5的部分来保存对它的更改。这是看起来像:
site: {
menus: [
{
_id: 1
sections:[
{ _id: 1 },
{ _id: 2 },
{ _id: 3 },
{ _id: 4 }
]
},
{
_id: 2
sections:[
{ _id: 5 }
]
}
]
}
Schemas.Site.findOne({ _id: req.session.siteID, 'menus.sections._id': req.params.sectionID }).select('menus.$.sections').exec(function(err, site){
if (err) return next(err);
var section = site.menus[0].sections.id(req.params.sectionID);
// update some things
section.whatever = something;
// save changes
site.save();
});
问题是,这适用于第一个菜单数组,但不适用于第二个菜单数组。如果我在第二个菜单部分(_id:5)上尝试此操作,它会在第一个菜单中更新。我确定我已经接近了,但选择时可能存在问题。这些只是数组,而不是嵌入式模型。
更新:似乎选择工作正常。当我在console.log中输出section变量时,它在数组中有正确的项。调用save时会发生此问题。它会覆盖错误的项目。我没有保存中间件运行。
答案 0 :(得分:0)
我现在使用menuID和sectionID来完成这项工作。我刚刚更新它看起来像这样:
var menu = site.menus.id(req.body.menuID),
section = menu.sections.id(req.params.sectionID);
如果有更好的方法可以在不需要menuID的情况下执行此操作,我会暂时不回答这个问题。