Mongodb находит отличное значение с диапазоном

#database #mongodb #nosql #aggregation-framework #nosql-aggregation

#База данных #mongodb #nosql #агрегация-фреймворк #nosql-агрегация

Вопрос:

У меня есть база данных mongodb, в которой у меня есть две коллекции — elements и properties . elements Выглядит примерно так —

 { _id: "someElementId", name: "Iron", type: "metal" }
  

И properties выглядит так —

 { _id: "somePropertyId", propName: "molecular weight", propType: "number", unit: null }
  

Каждое element может иметь несколько properties значений, соответствующих свойству. Например, iron может иметь свойства molecular weight , color , atomic weight и т.д.

Для этого я создал другую коллекцию, в которой я сохранил идентификатор элемента и соответствующий идентификатор свойства и его значение —

 { elementId: "someElementId", propId:  "somePropertyId", value: 55.845 }
  

Теперь я хочу найти имена всех уникальных свойств и диапазон их значений, который встречается в базе данных. Так, например, если 1 — наименьшее значение, соответствующее вышеуказанному свойству, а 100 — наибольшее значение, я хочу что-то вроде —

 [ { name: "molecular weight", range: { min: 1, max: 100 } } ]
  

Я могу получить отличные свойства и выполнить итерацию по ним, чтобы получить диапазон, но мне было интересно, есть ли лучший способ. Или, может быть, эта структура таблицы недостаточно эффективна?

Ответ №1:

Пожалуйста, проверьте, сработает ли это для вас:

 db.collection.aggregate([
  {
    $group: {
      _id: "$propId",
      min: {
        $min: "$value"
      },
      max: {
        $max: "$value"
      }
    }
  },
  {
    $lookup: {
      from: "properties",
      localField: "_id",
      foreignField: "_id",
      as: "name"
    }
  },
  {
    $unwind: "$name"
  },
  {
    $project: {
      _id: 0,
      "name": "$name.propName",
      "range": {
        "min": "$min",
        "max": "$max"
      }
    }
  }
])
  

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

Комментарии:

1. Спасибо. Но я должен получить name поле из properties коллекции в соответствии с id

2. Теперь я вижу, моя ошибка. Я обновил ответ, пожалуйста, взгляните!