数组上的$ gte和$ lte

时间:2019-01-31 04:35:16

标签: javascript node.js mongodb mongoose

我有架构

{ summaries:
  [
   {
     type: 'temp',
     min: 10,
     max: 40
   },
   {
     type: 'humidity',
     min: 3,
     max: 40
   }
  ],
  thresholds: [
  {
    type: 'temp',
    low: -10,
    high: 40
  },
  {
    type: 'humidity',
    low: 9,
    high: 30
  }
 ]
}

此目的以上是在采集一个记录。 我想记录,如果summaries.type == '临时' 和thresholds.type == '临时' 和summaries.min> thresholds.low

摘要对象与阈值比较的对象必须是相同的类型。 temp与temp比较,hum与hum比较。具有任何摘要对象温度,且最小值<任何阈值对象温度将被返回

示例:

{ summaries:
  [
   {
     type: 'temp',
     min: 10,
     max: 40
   },
   {
     type: 'humidity',
     min: 3,
     max: 40
   }
  ],
  thresholds: [
  {
    type: 'temp',
    low: -10,
    high: 40
  },
  {
    type: 'humidity',
    low: 9,
    high: 30
  }
 ]
}

将返回temp min = 10,阈值下限= -10。

{ summaries:
  [
   {
     type: 'temp',
     min: 10,
     max: 40
   },
   {
     type: 'humidity',
     min: 3,
     max: 40
   }
  ],
  thresholds: [
  {
    type: 'temp',
    low: 20,
    high: 40
  },
  {
    type: 'humidity',
    low: 9,
    high: 30
  }
 ]
}

将不会返回,因为temp min = 10,阈值temp low = 20,尽管阈值hum low = 9

1 个答案:

答案 0 :(得分:1)

您可以通过$expr

使用以下查询
db.collection.find({
  "$expr": {
    "$gt": [
      {
        "$arrayElemAt": [
          "$summaries.min",
          { "$indexOfArray": ["$summaries.type", "temp"] }
        ]
      },
      {
        "$arrayElemAt": [
          "$thresholds.low",
          { "$indexOfArray": ["$thresholds.type", "temp"] }
        ]
      }
    ]
  }
})