我有两个系列 用户{id,name}和文件{id,userId,name}我想查找文件名为" abc.xyz"的所有文件,我尝试使用$ lookup编写代码但获取所有文件属于用户而不是按名称" abc.xyz"过滤它,我写了以下查询。
db.user.aggregate([
{"$lookup":
{
"from": "files",
"localField": "id",
"foreignField": "userId",
"as": "fileList"
}
},
{"$project": { "filList":{
"$filter": {
"input":"$fileList",
"as":"file"
"cond": {"$eq": ["$file.name","abc.xyz"]}
}
}
}
}
])
谢谢
答案 0 :(得分:0)
我想查找文件名为“abc.xyz”的所有文件...但是获取所有文件属于用户而不是按名称“abc.xyz”过滤
根据您的上述问题,它也可以解释为“查找名称为abc.xyz
的所有文件及其所有者信息”。
在这种情况下,最好先使用$match过滤文件集合,以过滤等于abc.xyz
的文件名。这将限制查找users
集合的文档数量,而不是对两个集合执行查找,然后执行过滤。
例如:
db.files.aggregate([
{"$match": {"name":"abc.xyz"}},
{"$lookup": {
"from": "users",
"localField": "userId",
"foreignField": "_id",
"as": "users"
}
}]);
请注意,从files
查看users
,该集合现已撤消。示例结果将是:
"result": [
{
"_id": 111,
"userId": 999,
"name": "abc.xyz",
"owner": [
{
"_id": 999,
"name": "xmejx"
}
]
},
{
"_id": 222,
"userId": 998,
"name": "abc.xyz",
"owner": [
{
"_id": 998,
"name": "kalwb"
}
]
}
]
我还建议您查看: