如何在 Mongoose 中将任何数字指定为有效的 属性 键?

How to specify any number as a valid property key in Mongoose?

我想将传感器数据存储在 MongoDB 中,比如说以 1hz 的频率。为了有效地做到这一点,我想按照 this article recommends 的方式来做,即将多个数据点存储在同一个文档中,使用经过的秒数作为对象属性。

这是我希望典型文档的外观:

const record = {
    startingHour: 'Sun Sep 11 2016 03:00:00', // Date object
    values: {
        0: { // minute
            0: { lat: 52.0001, lon: 13.0001 },
            // ... all other seconds
            59: { lat: 52.9999, lon: 13.9999 }
        },
        // ... all other minutes
        59: {
            0: { lat: 53.0001, lon: 14.0001 },
            // ...
            59: { lat: 53.9999, lon: 14.9999 }
        }
    }
}

我如何在 Mongoose 中指定我希望每个文档 t 代表一个具有 60 个属性的小时,每个键是从 1 到 59 的数字 - 每分钟一个 - 而这些属性中的每一个依次具有 60 个属性, 和 那些 记录来表示实际位置值?

所以要保存新记录,我会做 record.values.59.59 = { lat: 53.9999, lon: 14.9999 }

如何在 Mongoose 中表示这种模式?

我设法通过创建函数来生成我想要的对象来做到这一点。然后我将这些生成的对象用作模式,将一个对象嵌入另一个对象并将它们放入最终模式中:

/**
 * Functions to generate objects for Minutes and Seconds
 * Each object containing 60 keys, going from 0 to 59
 */
function second() {
    let obj = {};
    for (var i = 0; i < 60; i++) {
        obj[i] = Location;
    }
    return obj;
}
function minute() {
    let obj = {};
    for (var i = 0; i < 60; i++) {
        obj[i] = Second;
    }
    return obj;
}

const Location = new Schema({
    latitude: { type: Number, required: true },
    longitude: { type: Number, required: true }
});

// Instantiates Second and Minute objects as schemas
const Second = new Schema(second());

const Minute = new Schema(minute());

// Actual schema
const RecordSchema = new Schema({
    startingHour: {
        type: Date,
        required: true
    },
    values: {
        type: Minute
    }
});

这让我可以保存如下对象:

{
    startingHour: new Date(),
    values: {
        0: {
            0: {
                location: { latitude: 0.03, longitude: 51.7 }
            },
            1: {
                location: { latitude: 0.03, longitude: 51.7 }
            }
            // ...
        },
        // ...
        59: {
            // ...
            59: {
                location: { latitude: 0.03, longitude: 51.7 }
            }
        }
    }
}