mongoose MongoDb $lookup聚合返回空数组

g6ll5ycj  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(142)

我有两个mongoDB集合,一个是Jobs,另一个是savedJob,我想获取作业的详细信息以及savedJob集合上的作业ID,但是mongoDb $lookup聚合返回一个空数组。
首先,我从savedJob集合中查询保存的作业数据,因此我通过用户ID方法id($match)查询保存的作业文档,并使用此管道从Job集合中获取作业详细信息数据。
查询代码为

const { userId } = req?.params;

  const pipeline = [
    {
      $match: {
        userId: userId,
      },
    },
    {
      $lookup: {
        from: "Jobs",
        localField: "jobId",
        foreignField: "_id",
        as: "jobDetails",
      },
    },
  ];

  const savedJobsWithJobDetails = await saveJob.aggregate(pipeline);
  console.log(savedJobsWithJobDetails);

代码在MongoDB Playground中运行良好,但在我的express服务器中,它返回一个空数组,我使用Mongoose 6.0.1。
保存的作业文档如下所示:

工作文件看起来像这样:


我检查了所有的模型名和字段名,但它返回一个空数组

7lrncoxx

7lrncoxx1#

我想你只是打错了。变更:

from: "Jobs"

from: "jobs"

你的$lookup(请注意这些工作)。
您还需要将jobIdsavejobs模式转换为ObjectId,因为此时您正在尝试查找目标id存储为ObjectId的字符串。
这可以通过一个简单的$addFields管道步骤来完成,专门利用$toObjectId来帮助您查找,如下所示:

const savedJobsWithJobDetails = await saveJob.aggregate([
   {
      $match: {
         userId: userId,
      },
   },
   {
      $addFields: { //< This new pipeline step
         jobIdToLookup: { $toObjectId: "$jobId" }
      },
   },
   {
      $lookup: {
         from: "jobs",
         localField: "jobIdToLookup", //< Now use jobIdToLookup here instead
         foreignField: "_id",
         as: "jobDetails",
      },
   },
   //{   
   //   $project: {
   //      jobIdToLookup: 0  //< Uncomment if you want to suppress this field from the output
   //   }
   //}
 ]).exec();

相关问题