mongodb - $ lookup无法使用$ project

时间:2017-02-07 11:51:33

标签: php mongodb mongodb-query aggregation-framework

我正在尝试从mongodb collection获取注册用户列表。在我的用户列表中,我存储了一些属于另一个集合的其他细节。像国家,州,城市

我正在使用mongodb version 3.2aggregate方法来获取此用户列表。

在我的用户列表中,我想显示国家/地区名称,州名称和城市名称,因此我使用$lookup加入这些集合以获取名称。

这只是一个采用国家,州和城市的示例,它可以是任何类型的类别数据,我只想在一个查询中实现加入集合。

这是我到目前为止所尝试的内容:

  1. 这是我的第一个WHERE CONDITION TO GET NAME'S - 我得到了所有的名字。
  2. 但是现在我还想从每个文档中只获得几列,所以我使用$project

    "$project": {
        "full_name": 1,
        "email": 1,
        "mobile": 1,
        "country": 1,
        "state": 1,
        "city": 1
     }
    
  3. 第二个WHERE CONDITION - 添加后 $project到我的条件,它只给我那几列 获取 country_name,state_name和city_name

    请告诉我为什么my query在使用$project后未提供 country_name,state_name和city_name

    [
       {
          "$match":{
             "status":{
                "$ne":2
             }
          }
       },
       {
          "$lookup":{
             "from":"countries",
             "localField":"country",
             "foreignField":"id",
             "as":"country_det"
          }
       },
       {
          "$lookup":{
             "from":"states",
             "localField":"state",
             "foreignField":"id",
             "as":"state_det"
          }
       },
       {
          "$lookup":{
             "from":"cities",
             "localField":"city",
             "foreignField":"id",
             "as":"city_det"
          }
       },
       {
          "$limit":10
       },
       {
          "$skip":0
       },
       {
          "$project":{
             "full_name":1,
             "email":1,
             "mobile":1,
             "country":1,
             "state":1,
             "city":1
          }
       }
    ]
    

1 个答案:

答案 0 :(得分:1)

$ project不作为WHERE条件工作,它不会过滤记录。 它作为映射器工作。 (它按指定的方式转换每条记录,这就是为什么它被命名为' project')。

在你的情况下。这个管道阶段:



"$project":{
         "full_name":1,
         "email":1,
         "mobile":1,
         "country":1,
         "state":1,
         "city":1
      }




直译道。取以下字段:full_name,email等,并省略任何其他字段。 请查看the docs

如果你需要做第二个WHERE,请使用另一个$ match阶段。

$ lookup运算符也会将匹配记录推送到数组,即使它是1:1关系。 所以你可能需要做

{$unwind: "$country_det"}
在$ lookup之后

并且州和城市有相同的对象(不是一个元素的数组)。

最后,如果您希望生成的记录具有名为country_name,state_name和city_name的属性,那么您确实需要$ project阶段,如下所示:



"$project":{
         "full_name":1,
         "email":1,
         "mobile":1,  
         "country":1,
         "state":1,
         "city":1,
         "country_name": "$country_det.path.to.country_name",
         "state_name": "$state_det.path.to.state_name",
         "city_name": "$city_det.path.to.city_name"  
      }




这是the resulting query。希望这会有所帮助。