Множественные подзапросы MongoDB

#mongodb #mongodb-query #mongodb-lookup

#mongodb #mongodb-запрос #mongodb-поиск

Вопрос:

Я вроде как новичок в базах данных без sql, поэтому у меня есть вопрос по подзапросам здесь.

Давайте представим следующую структуру:

 Type (_id, offerId)
Offer (_id, typeId, productId)
Product (_id, subId)
  

Мне нужно найти все типы по идентификатору SubID.

Я понятия не имею, как это работает для MongoDB, в SQL я бы сделал что-то вроде:

 select * from Type where offerId in 
  (select _id from Offer where productId in
    (select _id from Product where subId = 'test'));
  

Для MongoDB я пытался создать какой-то запрос агрегации, но это не работает:

 {
  "aggregate": "Type",
  "pipeline": [
    {
      "$lookup": {
        "from": "Offer",
        "localField": "_id",
        "foreignField": "typeId",
        "as": "subOffer"
      }
    },
    {
      "$lookup": {
        "from": "Product",
        "localField": "_id",
        "foreignField": "subOffer.productId",
        "as": "subProduct"
      }
    },
    {
      "$match": {
        "subProduct.subId": "test"
      }
    },
    {
      "$unwind": "$subProduct"
    },
    {
      "$unwind": "$subOffer"
    }
  ]
}
  

Есть предложения?

Ответ №1:

Вы можете попробовать,

  • $lookup о offer сборе с использованием конвейера
  • $match идентификатор типа
  • $lookup о product сборе с использованием конвейера
  • $match поля subId и productId
  • $match продукт не [] пуст
  • $match предложение не [] пустое
  • $project удалить поле предложения
 db.type.aggregate([
  {
    $lookup: {
      from: "offer",
      let: { tid: "$_id" },
      as: "offer",
      pipeline: [
        { $match: { $expr: { $eq: ["$$tid", "$typeId"] } } },
        {
          $lookup: {
            from: "product",
            as: "product",
            let: { pid: "$productId" },
            pipeline: [
              {
                $match: {
                  $and: [
                    { subId: "test" },
                    { $expr: { $eq: ["$_id", "$$pid"] } }
                  ]
                }
              }
            ]
          }
        },
        { $match: { product: { $ne: [] } } }
      ]
    }
  },
  { $match: { offer: { $ne: [] } } },
  { $project: { offer: 0 } }
])
  

Игровая площадка