我正在尝试从mongodb collection
获取注册用户列表。在我的用户列表中,我存储了一些属于另一个集合的其他细节。像国家,州,城市
我正在使用mongodb version 3.2
和aggregate方法来获取此用户列表。
在我的用户列表中,我想显示国家/地区名称,州名称和城市名称,因此我使用$lookup
加入这些集合以获取名称。
这只是一个采用国家,州和城市的示例,它可以是任何类型的类别数据,我只想在一个查询中实现加入集合。
这是我到目前为止所尝试的内容:
但是现在我还想从每个文档中只获得几列,所以我使用$project
"$project": {
"full_name": 1,
"email": 1,
"mobile": 1,
"country": 1,
"state": 1,
"city": 1
}
第二个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
}
}
]
答案 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。希望这会有所帮助。