You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mongoose中为对象使用数值键?

在Mongoose中给对象用数值键?你得先知道这个核心限制

嘿,刚好碰到过类似的问题!首先得给你泼个小冷水:不管用不用Mongoose,MongoDB本身都不支持对象的数值键——这是BSON格式的硬性规定,所有对象的键必须是字符串类型。所以你看到values里的0、38这些被转成"0"、"38",完全是正常现象,没法直接让它们以数值形式存储。

不过针对你的场景,有几个非常合适的替代方案,比硬用数值键更贴合MongoDB的设计:

1. 用数组(最适配你的情况)

看你的values键是0到59的连续数字,这不刚好就是数组的索引吗?直接把values改成数组就行,MongoDB和Mongoose对数组的支持特别友好:

// 先定义Schema
const metricSchema = new mongoose.Schema({
  timestamp_minute: Date,
  num_samples: Number,
  total_samples: Number,
  type: String,
  values: [Number] // 直接声明为数字数组
});

// 保存数据的时候
const metricDoc = new MetricModel({
  timestamp_minute: new Date("2013-10-10T23:06:00.000Z"),
  num_samples: 58,
  total_samples: 108000000,
  type: "memory_used",
  values: [999999, /* 中间省略... */, 1000000, 1500000, /* 直到 */, 1800000]
});

这样存完之后,你要取第38个值直接用metricDoc.values[38]就行,索引天然是数字,完全满足你的需求,还比对象更高效。

2. 键值对数组(适合非连续数值键)

如果以后你的数值键不是连续的,或者需要额外存和键相关的信息,那可以用一个包含键值对对象的数组:

// Schema这么定义
const metricSchema = new mongoose.Schema({
  // 其他字段不变
  values: [{
    key: Number, // 这里的key就是数值类型
    value: Number
  }]
});

// 数据示例
const metricDoc = new MetricModel({
  // 其他字段...
  values: [
    { key: 0, value: 999999 },
    { key: 37, value: 1000000 },
    { key: 38, value: 1500000 },
    // 其他键值对...
  ]
});

这种方式能明确保留数值类型的键,还能灵活应对各种非连续的情况,不会有类型转换的烦恼。

最后再提一句

别费劲找什么"绕过"BSON限制的方法了,根本不存在的。MongoDB从设计上就要求对象键是字符串,所以换成上面的替代方案才是正确的思路~

内容的提问来源于stack exchange,提问作者Red

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:33:30