不幸的是那建議使用.findOne()
,然後修改內容retured並使用.save()
提交到數據庫非常糟糕的例子「很多」。
你真正「應該」做的是這樣的:
io.on('connection', function (socket) {
socket.on('save_data', function (data) {
user.update(
{ "_id": socket.request.session.passport.user._id },
{ "$set": { "data": data } },
function(err,result) {
// react to result in callback
}
);
});
socket.on('remove_data', function() {
user.update(
{ "_id": socket.request.session.passport.user._id },
{ "$unset": { "data": "" } },
function(err,result) {
// react to result in callback
}
);
});
});
如果雙方$set
和$unset
作用在文檔的「數據」屬性。
這些操作是「原子」的,並且將根據「修改時的當前狀態」更新文檔。
任何.findOne()
和.save()
例子不,除非添加了「版本」的考慮aditional的處理。即使那樣,你很可能會遇到問題。
所以最好使用MongoDB中的「原生」更新運營商改變文件屬性和內容,因爲它們的設計考慮到作用於屬性(和僅屬性),您在更新說明聲明。
當然,這只是通過「設置」或刪除現有文檔「更新」屬性。
如果你的「文件」甚至不實際存在的,那麼你可以修改到:
io.on('connection', function (socket) {
socket.on('save_data', function (data) {
user.update(
{ "_id": socket.request.session.passport.user._id },
{ "$set": { "data": data } },
{ "upsert": true },
function(err,result) {
// react to result in callback
}
);
});
socket.on('remove_data', function() {
user.remove(
{ "_id": socket.request.session.passport.user._id },
function(err,result) {
// react to result in callback
}
);
});
});
當第一.update()
調用使用"upsert"改性劑,其「創造」一個新的文檔,其中一個還不存在。在$set
操作中的任何內容也被添加到文檔中,或文檔存在的位置「更新」。典型的會話存儲,雖然你可以優化,但這是另一個問題。
在相反的情況下,.remove()
方法從集合中刪除整個文檔,而不是簡單地「刪除屬性」,這是以前完成的。
因此,根據您的實際情況,這是對數據庫執行多個事務的更好方法,可能會在「取回」與其他操作之間發生其他操作。