2016-06-25 55 views
0

我的MongoDB有一個由模塊創建的sessions集合。該集合沒有模型或任何東西,因爲它不是由Mongoose創建的。貓鼬從沒有模型的集合中移除

如何在不指定模型的情況下訪問此集合?

我試過如下:

mongoose.connection.db.sessions.remove({'session.userId': userId}, function(e, found) { 
    console.log(found); 
    res.json({success: true}); 
}); 

雖然我收到的錯誤:Cannot read property 'remove' of undefined

+0

可能的重複http://stackoverflow.com/a/10519504/3284355請參閱編輯正確的答案。您可以使用mongo本機驅動程序包,因爲它已經安裝了 – Molda

回答

1

直接查詢集合將只解決你的問題的一部分。

從外觀上看,您使用express-sessionconnect-mongo來管理會話。這將會話數據(req.session存儲爲JSON在數據庫:

{ 
    "_id": "fLBj_McMFM-7PwVNsv9ov88vOAgoNiDa", 
    "session": "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"userId\":\"my-user-id\"}", 
    "expires": ISODate("2016-07-09T08:47:38.156Z") 
} 

正如你所看到的,session是一個字符串,而不是一個對象,所以直接使用session.userId不能查詢它。

如果您不能使用req.session.destroy(),您需要執行一個正則表達式查詢來匹配的JSON字符串中的用戶ID:

let collection = mongoose.connection.db.collection('sessions'); 
let query  = new RegExp(`"userId":"${userId}"`); 
collection.remove({ session : query }, function(e, found) { 
    console.log(found); 
    res.json({success: true}); 
}); 

它可能是最好的,如果userId是通過類似escape-string-regexp第一次運行以確保任何特殊字符都能正確轉義。

請注意,這不是一個快速查詢,特別是如果您的數據庫中有很多會話。

編輯:我剛剛發現了stringify選項connect-mongo,如果設置爲false,應該寫會話數據作爲常規對象的MongoDB,而不是作爲一個JSON字符串。

+0

您的假設是正確的。我正在使用'connect-mongo'的'express-session'來管理我的會話。在我的註銷API的'POST'中,我需要銷燬這些會話。我已經設法通過在我的API中調用'req.session = null'並在我的會話設置中設置'unset:'destroy''來實現。雖然有一個小問題,如果'req.session.userId'不是未定義的,我的主頁('app.get('/',...)')會提供一個不同的頁面。出於某種原因,我需要在註銷API之後重新刷新頁面兩次以使其未被設置。 – Fizzix

+0

@Fizzix可以在數據庫中檢查屬於會話密鑰的會話是否已經在註銷路由請求後被刪除?或者,如果'req.session.destroy()'可以更好地工作? – robertklep