1

这是我的用户文档

{
   "_id":"02a33b9a-284c-4869-885e-d46981fdd679",
   "context":{
      "email":"someemail@gmail.com",
      "firstName":"John",
      "lastName":"Smith",
      "company":[
         "e2467c93-114b-4613-a842-f311a8c537b3"
      ],
   },
}

公司文件

{
   "_id":"e2467c93-114b-4613-a842-f311a8c537b3",
   "context":{
      "name":"Coca Cola",
      "image":"someimage",
   },
};

这是我对用户的查询

let users = await Persons.aggregate(
            [{$project:
            {
                name: {$concat: ['$context.firstName', ' ', '$context.lastName']},
                companyId: {$arrayElemAt: ['$context.company', 0]}}
            },
            {$match: {name: searchRegExp}},
            {$lookup: {from: 'companies', let: {company_id: {$arrayElemAt: ['$context.company', 0]}}, pipeline:
            [
                {
                    $match: {
                        $expr: {
                            $eq: ['$_id', '$$company_id']
                        }
                    }
                },
                {
                    $project: {name: '$context.name'}
                }
            ],
            as: 'company'}}
            ]).toArray()

当我运行此查询时,我将公司字段作为一个空数组,我在这里做错了什么?

4

2 回答 2

2

您的第一个管道阶段$project仅输出_idname因此companyId当您尝试在其中引用时$context.company$lookup将有一个空值。您可以改用$addFields

{
    $addFields: {
        name: {
            $concat: [
                "$context.firstName",
                " ",
                "$context.lastName"
            ]
        },
        companyId: {
            $arrayElemAt: [
                "$context.company",
                0
            ]
        }
    }
}

蒙戈游乐场

于 2020-03-12T13:54:47.263 回答
1

当您添加字段companyId: {$arrayElemAt: ['$context.company', 0]}}时,您可以使用简单版本的$lookup. 无需设置两次,一次 ascompanyId: ...和 inlet: {company_id: ...}

db.user.aggregate([
   {
      $addFields: {
         name: { $concat: ["$context.firstName", " ", "$context.lastName"] },
         companyId: { $arrayElemAt: ["$context.company", 0] } 
      }
   },
   {
      $lookup: {
         from: "company",
         localField: "companyId",
         foreignField: "_id",
         as: "company"
      }
   }
])
于 2020-03-12T14:30:30.483 回答