#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"
}
}
}
])
Комментарии:
1. Спасибо. Но я должен получить
name
поле изproperties
коллекции в соответствии сid
2. Теперь я вижу, моя ошибка. Я обновил ответ, пожалуйста, взгляните!