Mongodb Mongo如何连接两个集合并在第二个集合上添加条件

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",

我有两套 用户{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"]}
           }
             }
         }
}
])
多谢各位

我想查找文件名为“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
过滤数组的正确方法。