2015-07-13 20 views
0

是否可以只定義一次用戶模型,然後用它來更新數據?在所有的例子中,我發現更新是在findOne回調。是否有可能做這樣的事情:如何設置用戶並使用Mongoose進行保存?

var User = require('../models/user'); 

module.exports = function (io) { 
    'use strict'; 
    io.on('connection', function (socket) { 
     var user = User.findOne({ 
      '_id': socket.request.session.passport.user._id 
     }); 

     socket.on('save_data', function (data) { 
      user.update({'data': data}); 
     }); 

     socket.on('remove_data', function() { 
      user.update({'data': false}); 
     }); 
    }); 
}; 

回答

2

不幸的是那建議使用.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()方法從集合中刪除整個文檔,而不是簡單地「刪除屬性」,這是以前完成的。

因此,根據您的實際情況,這是對數據庫執行多個事務的更好方法,可能會在「取回」與其他操作之間發生其他操作。