Mongo - 可能在查询项目子字段到顶级?

时间:2013-11-28 05:53:15

标签: mongodb

文件就是这样。

{ username : 'Fred', address : [ {country : 'USA'}, {country : 'Canada'}] }
{ username : 'James', address : [ {country : 'Canada'}, {country : 'Vietnam'}] }
{ username : 'Sally', address : [ {country : 'Vietnam'}] }
{ username : 'Alice', address : [ {country : 'USA'}] }

我想查询北美地址的任何记录,即。加拿大或美国,并返回匹配的位置作为文档的顶级元素。

我发现最接近运行查询的是this,它返回匹配的第一条记录的整个地址文档:

coll.find(
{address: {$elemMatch : {country : {$in : ['USA', 'Canada']}}},
{'username': 1, 'address.$' :1 }
)

返回例如。

{ username : 'Fred', address : [ {country : 'USA'} ] }

但有没有办法将国家直接投射到文件中?即

{ username : 'Fred', address.country : 'USA' }

理想情况下类似于'address.$.country'(但这似乎不起作用)。 'address.$.0.country' ..

也没有

2 个答案:

答案 0 :(得分:0)

不,你不能使用find来做到这一点,因为在投影operator中没有这样的东西。为什么不在应用层上执行此操作?

P.S。可能有一种方法可以通过聚合实现这一目标。

答案 1 :(得分:0)

正如Salvador Dali所提到的那样,投影算子不可能得到它。以下聚合查询可能会帮助您获得所需的结果。

db.myObject.aggregate(
  {$unwind : "$address"},
  {$match : {"address.country" : {$in : ["USA", "Canada"]}}}
);

结果返回如下:

"result" : [
    {
        "_id" : ObjectId("5296faf86bdafa216cab1738"),
        "username" : "Fred",
        "address" : {
            "country" : "USA"
        }
    },
    {
        "_id" : ObjectId("5296faf86bdafa216cab1738"),
        "username" : "Fred",
        "address" : {
            "country" : "Canada"
        }
    },
    {
        "_id" : ObjectId("5296fb056bdafa216cab1739"),
        "username" : "James",
        "address" : {
            "country" : "Canada"
        }
    },
    {
        "_id" : ObjectId("5296fb186bdafa216cab173b"),
        "username" : "Alice",
        "address" : {
            "country" : "USA"
        }
    }
]