Как запросить документ на основе поля в указанном поддокументе с помощью Mongoose - PullRequest
1 голос
/ 20 апреля 2020

Наличие двух моделей: Supplier и SupplierType - поле supplier_type на модели Supplier содержит ссылку ObjectId на соответствующий документ supplier_type.

Мне нужно получить все Suppliers, где Supplier.supplier_type.name - схема "Пекарей"

Supplier (сокращенная для краткости):

const supplierSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 2,
    maxlength: 255,
  },
  ...
  supplier_type: { type: ObjectId, ref: 'SupplierType' },
});

Supplier Type схема:

const supplierTypeSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 2,
    maxlength: 50,
  },
  ...
});

Типичный Supplier документ - где использовалось Supplier.supplier_type.populate():

{
            ...
            "_id": "5e9604d45c18767097e00059",
            "name": "Benny's",
            "supplier_type": {
                "suppliers": [
                    "5e9604d45c18767097e00059"
                ],
                "_id": "5e8f7e2eca14f14e36785b8d",
                "name": "Bakers",
                "createdAt": "2020-04-09T19:57:34.731Z",
                "updatedAt": "2020-04-14T18:48:21.853Z",
                "__v": 0
            },
            ...
        },

Запрос:

const supplier = await SupplierType.aggregate([
      {
        $match: {
          name: 'Bakers',
        },
      },
      {
        $lookup: {
          from: 'supplier',
          localField: 'pk',
          foreignField: 'id',
          as: 'supplier',
        },
      },
      {
        $project: {
          supplier: 1,
        },
      },
    ])
    console.log('LOG: Supplier: ', supplier);
    if (!supplier) return res.status(404).send({ error: 'Supplier not found', code: 609 });

    res.send({ data: supplier });

Возвращает:

{
    "data": [
        {
            "_id": "5e8f7e2eca14f14e36785b8d",
            "supplier": []
        }
    ]
}

1 Ответ

0 голосов
/ 20 апреля 2020

Можете ли вы попробовать следующий запрос? Скорее всего, это временное решение. Проверьте, работает ли это для вас, потому что это дает мне ожидаемый результат.

Проверьте это на следующей ссылке

  db.supplier_type.aggregate([
  {
    $match: {
      "name": "Bakers"
    }
  },
  {
    $lookup: {
      from: "supplier",
      localField: "id",
      foreignField: "supplier_type",
      as: "supplier"
    }
  },
  {
    $project: {
      supplier: 1
    }
  }
])

Обновление

Скорее всего, это проблема, связанная с ObjectId и строкой. Можете ли вы, если это работает.

db.supplier_type.aggregate([
  {
    $match: {
      "name": "Bakers"
    }
  },
  {
    $addFields: {
      supplier_type_object: {
        $toObjectId: "$_id"
      }
    }
  },
  {
    $lookup: {
      from: "supplier",
      localField: "supplier_type",
      foreignField: "supplier_type_object",
      as: "supplier"
    }
  },
  {
    $project: {
      supplier: 1
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...