Mongodb Mongo如何连接两个集合并在第二个集合上添加条件
我有两套 用户{id,name}和文件{id,userId,name}我想找到文件名为“abc.xyz”的所有文件,我试图使用$lookup编写一个代码,但获取所有属于用户的文件,而不是按名称“abc.xyz”对其进行过滤,我编写了以下查询Mongodb Mongo如何连接两个集合并在第二个集合上添加条件,mongodb,go,mongodb-query,mgo,Mongodb,Go,Mongodb Query,Mgo,我有两套 用户{id,name}和文件{id,userId,name}我想找到文件名为“abc.xyz”的所有文件,我试图使用$lookup编写一个代码,但获取所有属于用户的文件,而不是按名称“abc.xyz”对其进行过滤,我编写了以下查询 db.user.aggregate([ {"$lookup": { "from": "files", "localField": "id", "foreignField": "userId",
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"]}
}
}
}
}
])
多谢各位
我想查找文件名为“abc.xyz”的所有文件…但获取所有属于用户的文件,而不是按名称“abc.xyz”进行筛选
根据您上面的问题,它也可以解释为“查找名为abc.xyz的所有文件及其所有者信息”
在这种情况下,最好先使用过滤文件集合以过滤等于abc.xyz
的文件名。这将限制要查找用户
集合的文档数量,而不是对两个集合执行查找,然后执行筛选
例如:
db.files.aggregate([
{"$match": {"name":"abc.xyz"}},
{"$lookup": {
"from": "users",
"localField": "userId",
"foreignField": "_id",
"as": "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"
}
]
}
]
我还建议您查看:
$
。所以应该是$eq:[“$$file.name”,“abc.xyz”]
在$$file
的位置,而不是$file
。同样,虽然这确实有效,但实际上不是你“应该”做的。这里的问题是$lookup
返回的是“全部”“文档由外键匹配,而不是与给定条件匹配。在小结果集中,这是可以的。但在现实世界中,你应该用不同的方式来做。请告诉我如何用不同的方式来做?我是mongoDB的新手,您的建议将受到赞赏。刚刚回答,它解释了根据$lookup
过滤数组的正确方法。