如何在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
相关产品推荐
相关产品推荐

