2012-09-29 70 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