Nodejs中mongodb的文档中"__v" : 0 是什么字段
Nodejs中mongodb的文档中"__v" : 0 是什么字段
“__v” : 0
如题,每创建一个文档都会有这个字段。他起什么作用?
“__v” : 0
如题,每创建一个文档都会有这个字段。他起什么作用?
版本号。具体忘了
Node.js 中 MongoDB 的文档中 "__v": 0
是什么字段?
在使用 Node.js 和 Mongoose 进行 MongoDB 操作时,你可能会注意到每个文档都会包含一个 "__v"
字段,通常其值为 0
。这个字段并不是 MongoDB 自带的字段,而是由 Mongoose 添加的,用于版本管理。
__v
字段的作用
__v
字段是一个内部版本号(version key),用于启用 Mongoose 的内置版本控制功能。当启用此功能时,Mongoose 会在每次更新或保存文档时自动增加该版本号。这样做的目的是为了防止并发修改导致的数据冲突问题。
默认情况下,__v
字段的值为 0
,表示初始版本。每次更新操作后,该字段会递增。
示例代码
下面是一个简单的例子来说明如何使用 Mongoose 定义一个带有版本控制的模型:
const mongoose = require('mongoose');
// 连接到 MongoDB 数据库
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
// 定义一个 Schema
const userSchema = new mongoose.Schema({
name: String,
email: String
}, {
// 启用版本控制
versionKey: true
});
// 创建 Model
const User = mongoose.model('User', userSchema);
// 创建新用户
async function createUser() {
const newUser = new User({ name: 'John Doe', email: 'john@example.com' });
await newUser.save();
console.log('User created:', newUser);
}
// 更新用户信息
async function updateUser(userId) {
const updatedUser = await User.findByIdAndUpdate(userId, { name: 'Jane Doe' }, { new: true });
console.log('User updated:', updatedUser);
}
// 调用函数
createUser().then(() => updateUser('5f9c4a2b3cdef01234567890'));
在这个例子中,我们定义了一个 userSchema
,并启用了版本控制 (versionKey: true
)。当我们创建一个新的用户时,__v
字段会被设置为 0
。如果尝试更新用户信息,__v
字段将会递增。
总结
__v
字段主要用于版本控制,以确保数据的一致性和完整性。如果你不希望使用版本控制功能,可以在定义 Schema 时将 versionKey
设置为 false
或者直接移除它。
来自作者的文章:http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning 简单说这个字段用来在 save 文档时作为一个查询条件,以免在从「取出数据」到「save 数据」这段时间里,数据被其他进程修改,导致最后修改出现冲突。
也遇到这个问题,学到了…
3q
在Node.js与MongoDB交互时,你可能会注意到每个文档中都有一个__v
字段,并且它的值通常为0。这个字段是由Mongoose(一个Node.js的对象数据建模库)自动添加的,用于存储文档的版本号(version key)。__v
字段主要用于实现乐观锁机制,帮助确保在并发操作时不会出现数据冲突。
当你使用Mongoose模型保存新文档时,如果启用了自动版本控制,则会自动为文档添加__v
字段。默认情况下,__v
字段的值表示该文档的版本号,每次更新文档时,此值会递增。这样,当两个客户端尝试同时更新同一个文档时,较高版本号的客户端可以覆盖较低版本号的数据,从而避免了潜在的数据冲突问题。
然而,在某些场景下,你可能不希望在你的数据模型中包含这个字段。你可以通过设置versionKey: false
来禁用它。例如:
const schema = new mongoose.Schema({ ... }, { versionKey: false });
或者如果你只是想在查询结果中排除__v
字段,可以在查询时使用select()
方法:
Model.find().select('-__v').exec((err, docs) => {
if (err) return console.error(err);
console.log(docs);
});
在这个例子中,-__v
告诉Mongoose在返回的文档中不要包含__v
字段。