Агрегация MongoDB - выберите подборку в зависимости от данных.Это можно сделать? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть одна коллекция - "items"

У меня также есть две другие коллекции - "books_details" и "fruits_details".Они имеют разные структуры.

Некоторые элементы имеют тип item_type: book, а некоторые - item_type: fruit.

Каждый элемент имеет идентификатор item_type_id, соответствующий документу в соответствующей коллекции.

Я хочу отобразить комбинированный список предметов с деталями из соответствующей коллекции, в зависимости от item_type.

Похоже:

  • Мне нужно сделать два разных этапа поиска $и объединить их.Не удалось сделать это.

или

  • Сделайте один $ lookup и сделайте результаты основой второго этапа $ lookup и объедините их.Не удалось сделать это.

или

  • Мне нужно сделать поиск в зависимости от item_type.Не нашел способ сделать это.

Возможно ли это?Если да, то как?

Спасибо.

предметов

{
  "item_id": 1234,
  "item_type": "book",
  "item_type_id": 1
},
{
  "item_id": 5678,
  "item_type": "fruit",
  "item_type_id": 1
}

books_details

{
  "item_id": 1,
  "title": "Gone with the wind",
  "author": "Margaret Mitchell"
}

fruits_details

{
  "item_id": 1,
  "name": "Banana",
  "color": "yellow"
}

ожидаемый список

{
      "item_id": 1234,
      "item_type": "book",
      "item_type_id": 1,
      "fruits_details": {},
      "books_details": {"title": "Gone with the wind", "author": "Margaret Mitchell"}
    },
    {
      "item_id": 5678,
      "item_type": "fruit",
      "item_type_id": 1,
      "fruits_details": {"name":"Banana","color":"yellow"},
      "books_details": {}
    }

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать ниже aggregation

db.items.aggregate([
  { "$lookup": {
    "from": "fruits",
    "localField": "item_type_id",
    "foreignField": "item_id",
    "as": "fruits_details"
  }},
  { "$lookup": {
    "from": "books",
    "localField": "item_type_id",
    "foreignField": "item_id",
    "as": "books_details"
  }},
  { "$addFields": {
    "books_details": {
      "$cond": [{ "$eq": ["$item_type", "book"] }, "$books_details", {}]
    },
    "fruits_details": {
      "$cond": [{ "$eq": ["$item_type", "fruit"] }, "$fruits_details", {}]
    }
  }}
])
...