2015-09-16 45 views
0

我有一個index集合包含很多條款,並且包含來自其他集合的標識符的字段items。目前該字段存儲了一系列文檔,並且文檔是由$addToSet添加的,但我遇到了一些性能問題。看起來$unset操作執行速度更快,所以我打算將文檔數組更改爲嵌入文檔的文檔。

我是否認爲$ set/$ unset字段比推/拉嵌入文件到數組最好?

編輯:

後的小測試中,我們看到的設置/取消4倍的速度。在另一個 手中,如果我使用object而不是array,那麼計算 屬性的數量(vs數組的長度)有點困難,並且我們是 計數很多。但我們可以考慮每次使用$set和 添加一個項目數量的字段。

這是當前索引的文件:

{ 
    "_id": ObjectId("5594dea2b693fffd8e8b48d3"), 
    "term": "clock", 
    "nbItems": NumberLong("1"), 
    "items": [ 
    { 
     "_id": ObjectId("55857b10b693ff18948ca216"), 
     "id": NumberLong("123") 
    } 
    { 
     "_id": ObjectId("55857b10b693ff18948ca217"), 
     "id": NumberLong("456") 
    } 
    ] 
} 

頻繁更新操作: *刪除項目:{$pull:{"items":{"id":123}}} *新增項目:{$addToSet:{"items":{"_id":ObjectId("55857b10b693ff18948ca216"),"id":123,}}} *我可以改變$addToSet$push和檢查重複如果表演效果更好

這就是我計劃要做的:

{ 
    "_id": ObjectId("5594dea2b693fffd8e8b48d3"), 
    "term": "clock", 
    "nbItems": NumberLong("1"), 
    "items": { 
    "123":{ 
     "_id": ObjectId("55857b10b693ff18948ca216") 
    } 
    "456":{ 
     "_id": ObjectId("55857b10b693ff18948ca217") 
    } 
    } 
} 

*刪除項目:{$unset:{"items.123":true} *新增項目:{$set:{"items.123":{"_id":ObjectId("55857b10b693ff18948ca216"),"id":123,}}}

有關信息,論文操作與pymongo作出(或可以用PHP來完成,如果有一個很好的理由),但我不」牛逼認爲這是相關

回答

1

與任何性能問題,有許多可以發揮作用,像這樣一個問題的因素,如索引,需要打盤等

話雖這麼說,我懷疑你可能是正確的,增加一個ew字段或從MongoDB文檔中刪除舊字段比從數組中添加/刪除要快一些,因爲在搜索重複時,數組類型不太容易遍歷。

+0

經過一些測試(在一小部分文檔上)後,我們看到的過程快4倍。但我們會做更大規模的測試。另一方面,如果我使用對象而不是數組,那麼計算屬性的數量(與數組的長度)有點難。 (我剛剛編輯我的問題補充說) – Asenar

+0

這是正確的。這將是性能提升的折衷 – daveh