2013-12-16 202 views
2

我需要設置一個嵌套數組的一個對象,其屬性爲「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); 

}); 

我怎麼能做出這種更好?

回答

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" 
     } 
    ] 
} 

這樣可以節省你不得不遍歷桌面設定/刪除默認屬性。你可以在一個地方更改默認值。

+0

好!謝謝^^ – user1710825