在 MongoDB 2.0 及更早版本中,这是不可能的。您想要做的是返回数组的特定元素 - 但这不是您的投影实际执行的操作,它只会返回整个数组,然后返回每个数组的 z 元素。
然而,到了 2.2(在写这个答案时为 rc2),情况变得好一些了。您现在可以使用$elemMatch作为您的预测的一部分(请参阅服务器-2238有关详细信息),以便您只拉回所需的数组元素。所以,尝试这样的事情:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
或者,只需在投影本身中使用 $elemMatch,您可能认为这更干净:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
因此,现在至少返回的数组仅包含您想要的条目,您可以简单地引用相关的 z 元素(尚不支持子文档上的 elemMatch 投影)。
最后但并非最不重要的一点是,在 2.2 中我们有了聚合框架,以及它可以做的事情之一(使用$project
运算符,是重塑文档并将子文档和数组元素更改为顶级数组。为了得到你想要的结果,你可以这样做:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
结果如下:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }