Как обрабатывать несколько $ lookup и большое количество столбцов в $ project в mongoDB - PullRequest
0 голосов
/ 18 января 2019

У меня есть почти 4-5 таблиц, между которыми мне нужно объединиться. Я завершил это, используя $lookup, также мне не нужны все поля из вторичных таблиц / объединенных таблиц. Мне нужны все столбцы Первичной таблицы. Итак, я написал $project, чтобы выбрать необходимые столбцы.

Room.aggregate([{
        $lookup: {
            from: "users",
            localField: "userID",
            foreignField: "_id",
            as: "user"
        }
    }, {
        $lookup: {
            from: "areas",
            localField: "area",
            foreignField: "_id",
            as: "areas"
        }
    }, {
        $unwind: "$user",

    }, {$project : {

    }  
    }]

Мне было интересно, могу ли я как-нибудь упростить этот запрос или создать его в отдельном месте и объединить с основным запросом в более удобочитаемом и более простом формате.

Кроме того, мне нужно указать каждый столбец в $project, так как я хочу, чтобы все столбцы из таблицы Room и только несколько столбцов из объединенных таблиц.

Обновление

Вот мой пример определения коллекции
Номер:

{
    "_id": {
        "$oid": "5bcc2eb704c952178c4adbcd"
    },
    "userID": {
        "$oid": "5c0d4e9e7377833f3c362a63"
    },
    "roomQTY": 1,
    "roomPrice": 500,
    "area": [
        {
            "$oid": "5bd4a49857e0c023b0dac7b2"
        }
    ],
    "rating": 3,
    "amenities": [],
    "images": [],
    "isFurnished": true,
    "isActive": true,
    "category": {
        "$oid": "5c0c1438ccbc830d248167bf"
    },
    "roomName": "Shree Laxminarayan Residency",
    "person": "4",
    "size": 157,
    "createdDate": {
        "$date": "2018-10-21T07:45:59.492Z"
    },
    "updatedDate": {
        "$date": "2018-10-21T07:45:59.492Z"
    },
    "__v": 0
}

Удобства:

{
    "_id": {
        "$oid": "5bd4b19e57e0c023b0dac7cd"
    },
    "ammenitiesName": "Swimming Pool"
}

Категория:

{
    "_id": {
        "$oid": "5c0c1438ccbc830d248167bf"
    },
    "category_name": "PG"
}

Желание выхода:

{
  "data": [
    {
      "_id": "5bcc2eb704c952178c4adbcd",
      "userID": "5c0d4e9e7377833f3c362a63",
      "roomQTY": 1,
      "roomPrice": 500,
      "rating": 3,
      "amenities": [],
      "images": [],
      "isFurnished": true,
      "isActive": true,
      "category": "5c0c1438ccbc830d248167bf",
      "roomName": "Shree Laxminarayan Residency",
      "person": "4",
      "size": 157,
      "createdDate": "2018-10-21T07:45:59.492Z",
      "updatedDate": "2018-10-21T07:45:59.492Z",
      "username": "Hardik",
      "areas": [
        {
          "_id": "5bd4a49857e0c023b0dac7b2",
          "areaName": "South Bopal"
        }
      ],
      "ammenities": [
        {
          "ammentiesName": "Swimming Pool"
        },
        {
          "ammentiesName": "Gym"
        }
      ]
    }
  ],
  "code": 200
}

1 Ответ

0 голосов
/ 18 января 2019

Агрегирование в MongoDB 3.6 или выше обеспечивает конвейер для объединенной коллекции.

db.rooms.aggregate([{
    $lookup: {
      from: "Ammenities",
      let: {
        amenitiesIds: "$amenities"
      },
      pipeline: [{
          $match: {
            $expr: { $in: [ "$_id", "$$amenitiesIds" ] }
          }
        },
        { $project: { _id: 0 } }
      ],
      as: "ammenities"
    }
  },
  {
    $lookup: {
      from: "Category",
      let: {
        categoryId: "$category"
      },
      pipeline: [{
          $match: {
            $expr: { $eq: [ "$_id", "$$categoryId" ] }
          }
        },
        { $project: { _id: 0 } }
      ],
      as: "category"
    }
  }
])

Вы можете добавить несколько конвейеров на внутренний конвейер охлаждения.

Run It Ваш результат ждет Вас ...

...