更新与mongoose

我需要设置一个嵌套数组的对象与属性为“默认= 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); }); 

我怎样才能使这个更好?

也许一种替代方法是重构架构,以将默认桌面作为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" } ] } 

这可以节省您不得不遍历桌面设置/删除默认属性。 你可以在一个地方改变默认值。