Mongodb在范围内找到独特的价值

问题描述

我有一个mongodb数据库,其中有两个集合-elementspropertieselements看起来像这样-

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

properties看起来像这样-

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

每个element可以具有多个properties和对应于该属性的值。例如,iron可以具有属性molecular weightcoloratomic weight等。

为此,我创建了另一个集合,在其中存储了元素ID和相应的属性ID及其值-

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

现在,我想查找数据库中所有唯一属性名称及其值的范围。因此,例如,如果1是对应上述属性的最低值,而100是最高值,我想要类似-

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

我可以获取不同的属性并对其进行迭代以获取范围,但是我想知道是否有更好的方法。还是这种表结构效率不够?

解决方法

请检查这是否对您有用:

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 Playground