将唯一字符串映射到 MongoDB 中的(递增)数字

Map unique strings to (incrementing) numbers in MongoDB

假设我有 timestampsensor_namevalue 的文档(对某些测量进行建模),例如

{
  timestamp: 1,
  sensor_name: "Sensor A",
  value: 10
}
{
  timestamp: 2,
  sensor_name: "Sensor B",
  value: 11
}
{
  timestamp: 7,
  sensor_name: "Sensor A",
  value: 5
}
{
  timestamp: 10,
  sensor_name: "Sensor A",
  value: 13
}
{
  timestamp: 12,
  sensor_name: "Sensor B",
  value: 20
}

我怎样才能将每个唯一 sensor_name 映射到一个唯一的数字并以

的形式查询它
{
  timestamp: 1,
  sensor_nr: 1,
  value: 10
}
{
  timestamp: 2,
  sensor_nr: 2,
  value: 11
}
{
  timestamp: 7,
  sensor_nr: 1,
  value: 5
}
{
  timestamp: 10,
  sensor_nr: 1,
  value: 13
}
{
  timestamp: 12,
  sensor_nr: 2,
  value: 20
}

一般来说,我不关心Sensor A是否变成1Sensor B变为 2 或反之亦然。

答案应该是笼统的,可能有 20 多个传感器,可能的传感器名称没有“硬编码”,它们可能不遵循特定的命名模式。

我希望有人能提供比这更好的解决方案 - 我的直觉是它效率低得可怕,但它确实有效!

db.collection.aggregate([
  {
    "$group": {
      "_id": null,
      "sensor_names": {
        "$addToSet": "$sensor_name"
      }
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "pipeline": [],
      "as": "coll"
    }
  },
  {
    "$unwind": "$coll"
  },
  {
    "$set": {
      "coll.sensor_nr": {
        "$indexOfArray": [
          "$sensor_names",
          "$coll.sensor_name"
        ]
      }
    }
  },
  {
    "$replaceWith": "$coll"
  },
  {
    "$unset": [
      "_id",
      "sensor_name"
    ]
  }
])

mongoplayground.net 上试用。