Nodejs mongoose数据入库后json字段顺序问题

Nodejs mongoose数据入库后json字段顺序问题

我有一组数据是这样的 {a:1,b:2,c:3} 我用mongoose存入数据库后变成了 {c:3,b:2,a:1} 能改成正常的顺序吗?

7 回复

当然可以。Mongoose 默认情况下不会保证 JSON 对象的属性顺序,因为 JavaScript 对象本身并不保证属性的顺序。不过,你可以通过一些方法来确保插入数据库后的 JSON 字段保持原有的顺序。

解释

JavaScript 对象的属性顺序在 ES2015 (ES6) 之后得到了规范,但 Mongoose 在处理对象时可能会导致属性顺序发生变化。为了确保字段顺序不变,你可以在插入数据库之前手动对对象进行排序。

示例代码

以下是一个简单的示例,展示如何在将数据插入 MongoDB 之前保持字段顺序:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义一个简单的 schema
const mySchema = new Schema({
    a: Number,
    b: Number,
    c: Number
});

// 创建模型
const MyModel = mongoose.model('MyModel', mySchema);

async function insertData() {
    // 原始数据
    const data = { a: 1, b: 2, c: 3 };

    // 将数据转换为有序数组,然后再转换回对象
    const orderedData = {};
    Object.keys(data).sort().forEach(key => {
        orderedData[key] = data[key];
    });

    // 插入数据库
    try {
        const result = await MyModel.create(orderedData);
        console.log(result);
    } catch (error) {
        console.error(error);
    }
}

// 连接到 MongoDB 并插入数据
mongoose.connect('mongodb://localhost:27017/testdb', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => insertData())
    .catch(err => console.error(err));

解释

  1. 定义 Schema 和 Model:

    • 我们定义了一个简单的 Mongoose 模型 MyModel,它包含三个字段 a, b, 和 c
  2. 插入数据前的处理:

    • 在插入数据之前,我们创建了一个有序的对象 orderedData
    • 使用 Object.keys(data).sort() 获取排序后的键数组,然后遍历这些键并将其添加到新的对象中。
  3. 插入数据库:

    • 使用 MyModel.create(orderedData) 方法将数据插入到数据库中。

这样,你就可以确保插入数据库的数据字段顺序与原始顺序一致。希望这对你有帮助!


这个是mongodb的原因,为了性能会调整字段的顺序,因此不要对字段的顺序做任何假设

但是我用nativedriver 插入的数据就是正常顺序呢

json本身的定义就是对key无序的。所以只要你用json。就必须假设key无序。即便你使用某一个driver的顺序和你期望的一样,你仍然要做这种假设。

Key是无序的

其实严格意义上mongoDB的文档是有序的,而不是一般意义的json

在使用 Mongoose 存储数据时,默认情况下 MongoDB 和 Mongoose 并不会保留字段的原始顺序。这是因为 MongoDB 存储的数据是无序的,它并不会记录字段的插入顺序。如果你需要保持字段的顺序,可以在读取数据后手动对 JSON 对象进行排序。

示例代码

假设你有一个 Mongoose 模型 MyModel,你可以通过以下步骤来保持字段顺序:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const mySchema = new Schema({
    a: Number,
    b: Number,
    c: Number
});

const MyModel = mongoose.model('MyModel', mySchema);

// 插入数据
const data = { a: 1, b: 2, c: 3 };
const doc = new MyModel(data);
doc.save((err) => {
    if (err) console.log(err);
    else console.log('Data saved successfully.');
});

// 查询数据并按顺序排列
MyModel.findOne().then(doc => {
    if (!doc) return;
    
    // 手动将字段按顺序排列
    const orderedData = {
        a: doc.a,
        b: doc.b,
        c: doc.c
    };

    console.log(orderedData); // 输出:{ a: 1, b: 2, c: 3 }
});

解释

  1. 模型定义:定义一个简单的 Mongoose 模型 MyModel,包含三个字段 a, b, c
  2. 保存数据:创建一个实例并保存到数据库中。
  3. 查询数据:查询数据库中的数据,并手动创建一个新的对象 orderedData,确保字段按预期顺序排列。

注意事项

  • MongoDB 本身不保证字段的顺序,因此你需要在应用层手动处理。
  • 如果你需要频繁地按顺序访问字段,可以考虑使用上述方法。
  • 如果字段顺序对你非常重要,可以考虑使用其他数据库或数据结构来存储数据。

希望这些信息对你有所帮助!

回到顶部