Nodejs mongoose操作mongodb出现多余字段

Nodejs mongoose操作mongodb出现多余字段

从页面表单提交了两个字段name和password,mongodb新增成功,但最后那个"__v"是怎么回事? 2014-10-25_151527.png

3 回复

Nodejs Mongoose 操作 MongoDB 出现多余字段

在使用 Node.js 和 Mongoose 进行 MongoDB 操作时,你可能会遇到一些额外的字段被自动添加到你的文档中。其中一个常见的例子就是 __v 字段。本文将解释 __v 是什么,并提供如何处理这个问题的解决方案。

什么是 __v 字段?

__v 字段是 Mongoose 自动添加的一个版本号(version key),用于实现内置的乐观并发控制(optimistic concurrency control)。当模型第一次保存时,Mongoose 会自动设置该字段的值为 0。每次更新文档时,Mongoose 都会检查该字段,以确保数据没有被其他进程修改过。

示例代码

假设你有一个用户模型定义如下:

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

const UserSchema = new Schema({
    name: String,
    password: String
});

module.exports = mongoose.model('User', UserSchema);

当你从页面表单提交 namepassword 字段,并调用 save() 方法时,Mongoose 会在数据库中创建一个新的文档,并自动添加 __v 字段:

const User = require('./models/User');

async function createUser() {
    const user = new User({
        name: 'John Doe',
        password: 'securePassword'
    });

    try {
        await user.save();
        console.log('User saved successfully');
    } catch (error) {
        console.error('Error saving user:', error);
    }
}

运行上述代码后,生成的文档看起来像这样:

{
    "_id": "64e6b8c0c9f9e7f5b3d6a0e4",
    "name": "John Doe",
    "password": "securePassword",
    "__v": 0
}

如何禁用 __v 字段

如果你不希望 Mongoose 添加 __v 字段,可以在模型定义中禁用它:

const UserSchema = new Schema({
    name: String,
    password: String
}, { versionKey: false });

或者在模型实例化时使用 toObjecttoJSON 方法来移除 __v 字段:

const user = new User({
    name: 'John Doe',
    password: 'securePassword'
});

user.toObject({ versionKey: false });
user.toJSON({ versionKey: false });

通过这些方法,你可以更好地控制 Mongoose 在 MongoDB 中存储的数据结构。


在使用 Mongoose 操作 MongoDB 时,如果发现插入的数据中多出了一个 __v 字段,这是因为在 Mongoose 中默认启用了版本键(version key)的功能。__v 字段用于存储文档的版本号,主要用于处理并发更新问题。

如果你不希望在插入数据时包含 __v 字段,可以通过在定义 Schema 时不启用版本键来解决这个问题。具体操作如下:

示例代码

const mongoose = require('mongoose');

// 禁用版本键
const userSchema = new mongoose.Schema({
    name: String,
    password: String
}, { versionKey: false });

const User = mongoose.model('User', userSchema);

// 插入数据
const newUser = new User({ name: 'test', password: '123456' });
newUser.save((err, doc) => {
    if (err) {
        console.error(err);
    } else {
        console.log(doc);
    }
});

解释

  1. 禁用版本键:在定义 Schema 时,通过 { versionKey: false } 参数禁用了版本键功能。
  2. 插入数据:当你插入一条新的用户记录时,不会生成 __v 字段。

这样设置后,在插入数据时就不会出现多余的 __v 字段了。

回到顶部