2012-09-29 114 views
0

子集:如果我有類似的集合:檢索數據從MongoDB的

[ 
    { "test": [ { "a": 1, "b": 2 }, { "a": 10, "b": 1 } ] }, 
    { "test": [ { "a": 5, "b": 1 }, { "a": 14, "b": 2 } ] }, 
    ... 
] 

如何獲得只由該a值時b2數據的一個子集?在SQL中,這將是類似於:

SELECT test.a FROM collection WHERE test.b = 2 

我也明白,我可以限制哪些數據,我得到的東西,如:

collection.find({ }, { "test.a": 1 }) 

但是返回所有a值。我怎樣才能限制它,以便它只返回b2WHERE test.b = 2部分SQL等效值)的值?

回答

2

您可以通過添加一個選擇對象爲您find調用的第一個參數,並使用$elemMatch投影算這樣做:

collection.find({ 'test.b': 2 }, { test: { $elemMatch: { b: 2 } }, 'test.a': 1 }) 

但這僅將每個文檔,其中b返回第一個test數組元素是2.如果test數組中有多個b:2元素,則需要使用聚合框架。

+0

因爲他提到價值* s *我想他不能使用這個,將不得不使用聚合框架/地圖減少。值得注意的是,聚合框架雖然很慢。即使使用map-reduce,某些用戶發現這些類型的查詢速度比RDBMS上等效的SQL查詢慢20倍以上[http://stackoverflow.com/a/2613106/324381]。子文檔查詢似乎對MongoDB來說目前有點弱點。 – UpTheCreek