2012-11-16 151 views
0

快速的問題,你知道,如果蒙戈可以創建以下數據的索引:MongoDB的多索引

{ 
    prices: { 
     price1: 0.90, 
     price2: 0.12, 
     price3: 0.13 
    } 
} 

,所以我想這樣做指數這樣ensureIndex({prices:1}),但我不知道將它包括所有的價格和它的值在裏面。

我需要以這種方式放置數據而不是標準數組方法的原因是因爲我希望能夠根據已選擇的價格版本進行排序,即sort({prices.price:1})

任何想法?

歡呼

回答

0

好吧我想我現在明白了。您想按給定的價格版本對集合中的所有文檔進行排序。

,因爲你不能做的位置排序因此這將不會與子文檔工作得很清楚:

find({price.version:1}).sort({price.$.version: 1}) 

因此,這將是作爲根文檔中的平面結構更好。事實上,在你的例子中把它放在一個子文檔中除了分組實際使索引變得更難的數據之外沒有其他用處。

所以我會建議你只是項目字段的根文件。你可以用@ Philipp的答案在這裏用匯總框架做一些事情,但是這聽起來像這個查詢可能經常運行並且可能在更大的工作集上運行。

這樣的新文檔strucutre是:

{ 
     price1: 0.90, 
     price2: 0.12, 
     price3: 0.13 
} 

這是我做這種東西在這兩個SQL和MongoDB,並與所有領域的複合索引效果很好。

同樣,因爲MongoDB當然是無模式的,所以當您想要嚮應用程序添加新價格時,不必擔心維護數據庫的問題。

+0

這是很好,但它不容易創建索引,因爲我無法確切知道將有多少價格版本,因此可能最初的想法與分組價格不起作用。 – Marcin

+1

@Marcin Yea創建索引是一個問題,我想這也是任何數據庫都會遇到的一個問題。嗯,我會繼續思考 – Sammaye

+0

謝謝Sammaye,是的,除非你不想跨越幾張桌子,否則肯定是一個棘手的問題。 – Marcin

0

當你對這些數據做ensureIndex({prices:1}),你會創造超過的價格1,price2和price3的精確組合的指數。因此,只有在搜索所有三種價格的完全匹配(搜索或潛在結果中不會有額外價格)時,才能搜索索引。

但是,當你組織你的數據一樣,你可以搜索個別價格:

{ 
    prices: [ 
     {version: 1, value: 0.99}, 
     {version: 2, value: 0.12}, 
     {version: 3, value: 0.13} 
    ] 
} 

然後,您可以添加一個複合索引,其中包括prices.version,prices.value從父文檔的唯一標識符。這樣,您可以通過{prices.version:1}{prices.version:2}快速搜索產品。請參閱the documentation of indices in mongodb

+0

那麼我將如何根據特定版本的定價對所有內容進行排序? 'sort({prices.value:1})'將按任何價格排序,而不僅僅依賴版本 – Marcin

+0

'sort({prices.version:1})'來做。 – Sammaye

+0

不是真的,那是基於價格版本而不是它的價值排序 – Marcin