【发布时间】:2020-09-02 15:50:47
【问题描述】:
人员集合:
{
"_id": ObjectId("5f3258cfbaaccedaa5dd2c96"),
"gender": "male",
"name": {
"title": "mr",
"first": "victor",
"last": "pedersen",//... more properties
}
人物详情集合:
{
"_id": ObjectId("5f3a91e68b1c26e68f9ed3ad"),
"country": "India",
"personid": ObjectId("5f3258cfbaaccedaa5dd2c96")
}
从相关人员那里获取文件以及相关人员详细信息,其中相关国家/地区的人员详细信息为“印度”
因此,如果 10 个人中只有 3 个来自印度。我应该在结果集中获得 3 个人员文档及其相关人员详细信息
查询:
[
{
"$match": {
"$or": [
{
"$expr": {
"$eq": [
"$gender",
"male"
]
}
}
]
}
},
{
"$facet": {
"totalCount": [
{
"$count": "value"
}
],
"data": [
{
"$project": {
"_id": "$_id",
"fname": "$name.first",
"lname": "$name.last",
"dobage": "$dob.age",
"registeredAge": "$registered.age"
}
},
{
"$sort": {
"name.first": 1
}
} ,
{
"$lookup": {
"from": "persondetails",
"localField": "_id",
"foreignField": "personid", // how to add where clause in this lookup?
"as": "persondetail"
}
}
]
}
}
]
编辑:
https://mongoplayground.net/p/3vBs6Frt-aK
预期结果:
[
{
"data": [
{
"_id": ObjectId("5f3258cfbaaccedaa5dd2c96"),
"fname": "victor",
"lname": "pedersen",
"persondetail": [
{
"_id": ObjectId("5f3a91e68b1c26e68f9ed3ad"),
"country": "India",
"personid": ObjectId("5f3258cfbaaccedaa5dd2c96")
}
]
}],
"totalCount": [
{
"value": 1
}
]
}
]
【问题讨论】:
-
你不需要 where 子句,但在 $lookup 之后需要一个额外的 $match 阶段来过滤掉你不希望在结果中看到的人。
-
这不会影响性能吗? @AlexBlex
-
很可能是的。你会注意到其中的不同吗?这取决于。过早的优化被认为是一种适得其反的做法,但如果它很关键,您最好在数据集上对其进行测试。
标签: javascript node.js mongodb mongodb-query nosql