2011-08-09 37 views
1

我有一些代碼需要在我的mongoDB數據庫中更新記錄。所以我首先找到記錄,然後我更新記錄。但是,這些記錄有很多與它們一起存儲的文本數據,所以我不想在返回時檢索整個文檔;只是爲了讓我可以更新它。我認爲,如果我在mongoid中使用「only(...)」方法,那隻會返回該屬性。儘管這些查詢似乎運行得非常緩慢,但我不確定他們是否完成了我認爲他們正在完成的任務。MongoDB/mongoid update_attributes方法慢嗎?

d = Document.only(:title).find(title) # using 'title' as key in mongoDB 
d.update_attributes({ author: "author_name" }) 

是否有更快的方式來執行這個所需的查詢?

回答

0

MongoDB提供了許多高度優化的修改器操作。查看使用$set操作只設置一個密鑰,而不必處理文檔的其餘部分。您也可以在單個操作中執行更新和查詢。一個土生土長的MongoDB的查詢與指定title更新的所有記錄author是這樣的:

var title = "The Title" 
db.documents.update({ title: title }, { $set: { author: "The Author" } }) 

希望你能找到一種方法,通過Mongoid沿傳遞查詢。如果沒有,您可以直接到本地Mongo適配器運行它。欲瞭解更多信息,請參閱docs on modifier operations

+0

在答案上添加'Document.where(title:title).update_all(作者:「作者」)''。但是這會跳過驗證。 – rubish

+0

這與jacobra目前所做的功能相當。它是'$ set'運算符,它允許更新記錄的一部分而不用提取整個事物。 – Emily

+0

這個查詢不需要提取文檔就可以轉換爲'$ set'。只是一個更好的語法:) – rubish

0

我的一個想法是,你可以將集合分成兩個集合:一個具有文本元素(名稱,作者,yearPublished,numPages等),另一個具有外鍵(可以只是MongoDB的_id)和文本本身。然後,您可以在較小的集合上修改像作者姓名這樣的東西,我相信這樣會更快地執行...我想,有些東西需要測試。不過,我認爲你的速度問題是由於記錄的大小。我個人注意到,從沒有很多屬性的簡單測試數據集到每個記錄具有許多屬性的真實數據集,性能出現重大損失。

相關問題