2017-10-07 134 views
0

的部分更新我有一個簡單的用戶模式:貓鼬對象

{ 
    _id: "59d72070d9d03b28934b972b" 
    firstName: "first" 
    lastName: "last" 
    email: "[email protected]" 
    subscriptions: { 
    newsletter: true, 
    blog: true 
    } 
} 

我試圖做subscriptions對象的部分更新。我傳遞了用戶的id和一個可以具有對象的一個​​或兩個屬性的對象。假設我只想更新newsletter並將其設置爲false。我會送:

{ id: "59d72070d9d03b28934b972b", payload: { newsletter: false } } 

然後:

const user = await User.findByIdAndUpdate(
    args.id, 
    { $set: { subscriptions: args.payload } }, 
    { upsert: true, new: true } 
); 

這將返回:

subscriptions: { 
    newsletter: false 
} 

有沒有辦法只能修改newsletter屬性時,我只在通過newsletter有效載荷對象而不刪除其他屬性?我知道在這個例子中我只有兩個屬性,但是隨着時間的推移,對象將不斷擴展。

回答

0

最後我做了以下內容:

const user = await User.findById(args.id); 

// merge subscriptions 
user.subscriptions = Object.assign({}, user.subscriptions, args.payload); 

return user.save(); 
+0

這將工作,但會執行2個請求:1'users.findOne'和1'users.update',而最初只有1個'users.findAndModify' –

0

僅更新嵌套的字段,使用{ "subscriptions.newsletter": false }

const user = (await User.findByIdAndUpdate(
    args.id, { 
     $set: { 
      "subscriptions.newsletter": args.payload 
     } 
    }, { 
     new: true 
    } 
)); 

如果你的輸入可以有缺失的領域,你可以在$set建立一個動態查詢,只有你在你的輸入指定的字段:

async function save(id, query) { 
    const user = (await User.findByIdAndUpdate(
     id, { 
      $set: query 
     }, { 
      new: true 
     } 
    )); 
    console.log(user); 
} 

var id = mongoose.Types.ObjectId("59d91f1a06ecf429c8aae221"); 
var input = { 
    newsletter: false, 
    blog: false 
}; 

var query = {}; 
for (var key in input) { 
    query["subscriptions." + key] = input[key]; 
} 

save(id, query);