我需要设置一个嵌套数组的对象,其属性为“default = true”,但我只需要一个具有此属性的对象,其他人不能拥有此属性。
示例:
{
"_id": "xxxxx",
"name": "Jmae",
"desktops": [
{
"_id": "xxxxx",
"name": "Mike",
"default": true
},
{
"_id": "xxxxx",
"name": "Aris"
},
{
"_id": "xxxxx",
"name": "John"
}
]
}
这只是设置,但不要删除:
var filter = {
"_id": platformId,
"desktops._id": desktopId
},
updateParams = {
"$set": {
"desktops.$.default": true
}
};
crud.findOneAndUpdate(filter, updateParams, null, callback);
下一个代码可以正常工作,但是它很大:
crud.findByIdNeed(platformId, null, null, function (err, platform) {
// En caso de error
if (err) {
callback(err);
return;
}
_.each(platform.desktops, function (desk, i) {
if(desk._id.toString() === desktopId){
platform.desktops[i].default = true;
}else if(platform.desktops[i].default){
delete platform.desktops[i].default;
}
});
platform.save(callback);
});
我怎样才能做得更好?
答案 0 :(得分:2)
也许一种替代方法是重新构建您的架构,将默认桌面作为platform
中的一个属性,它将引用相关桌面的_id
。例如,您的架构可能类似于:
{
"_id": "xxxxx",
"name": "Jmae",
"defaultDesktop": 1932, // Contains the ID of the relevant desktop
"desktops": [
{
"_id": 1932, // This is your default desktop
"name": "Mike"
},
{
"_id": "xxxxx",
"name": "Aris"
},
{
"_id": "xxxxx",
"name": "John"
}
]
}
这样可以省去迭代桌面设置/删除默认属性的麻烦。您可以在一个地方更改默认值。