Это мой запрос для агрегирования для организации, человека и транзакций

db.transactions.aggregate([
    {
        $lookup: {
            from: "organizations",
            localField: "organization",
            foreignField: "_id",
            as: "or",
        },
    },
    {
        $lookup: {
            from: "people",
            localField: "person",
            foreignField: "_id",
            as: "person",
        },
    },
    {
        "$unwind": "$person"
    },
    { $group:
            {
                _id: "$_id",
                p: {
                    $first: "$person._id"
                },
                or: {
                    $first: {
                        $arrayElemAt: [
                            "$or.members",
                            0,
                        ]
                    }
                },
            }
    },
    {
       $project: {
           out: {
               $filter: {
                   input: "$or",
                   cond: {
                       $eq: [ "$$this._id", "$person._id"]
                   }
               }
           }
       }
    }
])

Значение or.member представляет собой такой массив:

[
 {
  "accessLevel": "organization_admin", 
  "title": "CTO", "_id": ObjectId("5f130f357907baf4dc919816"), 
  "status": true
 }
]

И такой сбор транзакций:

// transaction
{
  _id: ObjectId("5f1284078a7dd8a6b9140c97")
  organization: ObjectId("5f127ce1e354f37df698f55e")
  person: ObjectId("5f1284078a7dd8a6b9140c95")
  actionTransaction: "Purchase"
}

// organizations
{
  _id: ObjectId("5f127ce1e354f37df698f55e")
  name:  "MongoDB Inc"
  phoneNumber: "+1111111111"
  members: [
              {
                  _id: ObjectId("5f1284078a7dd8a6b9140c95")
                  title: "CEO"
                  role: "ADMIN"
              },
              {
                  _id: ObjectId("5f1284078a7ff8a6b9300d93")
                  title: "CHAIRMAN"
                  role: "Others"
              }
          ]
}

// people 
{
   _id: ObjectId("5f1284078a7dd8a6b9140c95")
   name: "Foo Bar"
   gender: "Male"
}

Когда я запрашиваю строку из другого поля в organization.member, это выглядит нормально, но когда я запрашиваю с идентификатором, это всегда пустой результат массива что-то не так? выделенный текст

1
jhgju77 19 Июл 2020 в 08:21

1 ответ

Лучший ответ

Вы использовали $group, чтобы установить p следующим образом

                p: {
                    $first: "$person._id"
                },

Итак, на последнем этапе $person._id больше нет, есть только p, вы должны изменить $person._id на $p

    {
       $project: {
           out: {
               $filter: {
                   input: "$or",
                   cond: {
                       $eq: [ "$$this._id", "$p"]
                   }
               }
           }
       }
    }
2
thammada.ts 19 Июл 2020 в 05:53