Nodejs mongoose操作mongodb出现多余字段
Nodejs mongoose操作mongodb出现多余字段
从页面表单提交了两个字段name和password,mongodb新增成功,但最后那个"__v"是怎么回事?
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);
当你从页面表单提交 name
和 password
字段,并调用 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 });
或者在模型实例化时使用 toObject
或 toJSON
方法来移除 __v
字段:
const user = new User({
name: 'John Doe',
password: 'securePassword'
});
user.toObject({ versionKey: false });
user.toJSON({ versionKey: false });
通过这些方法,你可以更好地控制 Mongoose 在 MongoDB 中存储的数据结构。
应该是 mongoose 加的 http://mongoosejs.com/docs/guide.html#versionKey
在使用 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);
}
});
解释
- 禁用版本键:在定义 Schema 时,通过
{ versionKey: false }
参数禁用了版本键功能。 - 插入数据:当你插入一条新的用户记录时,不会生成
__v
字段。
这样设置后,在插入数据时就不会出现多余的 __v
字段了。