如何在MongoDB的$lookup中返回单个对象而不是数组?

如何在MongoDB的$lookup中返回单个对象而不是数组?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,当我们在MongoDB的聚合查询中使用$lookup时,我们使用这种格式 { $lookup: { from: "users", localField: "userId", foreignField: "_id", as: "user" } } 其中,user作为对象数组返回,然后我们需要在$project阶段中使用$arrayElemAt作为单个对象返回。像 { $project: { use

当我们在MongoDB的聚合查询中使用
$lookup
时,我们使用这种格式

{
   $lookup:
     {
       from: "users",
       localField: "userId",
       foreignField: "_id",
       as: "user"
     }
}
其中,
user
作为对象数组返回,然后我们需要在
$project
阶段中使用
$arrayElemAt
作为单个对象返回。像

{
  $project:
   {
    user:
      { 
        $arrayElemAt: [ "$user", 0 ] 
      }
   }
}

因此,我的问题是,我们如何从
$lookup
阶段返回
用户
作为单个对象而不是数组

您不能使用
$lookup
这样做,但最干净的方法是在之后添加一个新阶段,如下所示:

{
  $unwind: "$user"
}

由于每个文档只有一个用户,因此最终将使用相同的集合,但这次用户不再是数组。如果每个文档有多个用户(例如2个),则最终会有2个文档,每个用户一个。

返回数组。我怀疑你能做得比在下一阶段做得更好。是的,目前在下一阶段使用
$project
,但我还必须预测20多个字段。如果我能在
$lookup
@AlexBlexIt中返回一个对象可能会更好,但事实并非如此。假设查找正好匹配1个元素。这对您的情况可能是公平的,因此保持这种逻辑的最佳位置是用户空间——管道的下一个阶段。当您的应用程序发展到这种假设不再成立的地步时,您会很高兴您可以自己更改查询并选择如果您有多个匹配元素该怎么做。我相信,正如@AlexBlex正确指出的,文档明确声明返回数组,仅此而已。您可能想做的是打开JIRA功能请求,我可以很高兴地对此进行投票。谢谢@chridam的建议。在JIRA中创建了一个功能请求问题