Nodejs mongoose一个奇怪的问题?
Nodejs mongoose一个奇怪的问题?
如题,我在用mongoose的时候,用了两个schema,如下: var Comments = new Schema({ projectName : String , comment : String , created_at : Date });
//定义user对象模型 var UserScheme = new Schema({ userId:ObjectId, username:String, password:String, userAccountId:ObjectId, userAccountSummary:{type:String,default:“1000”}, myProjectsList:[], myCommentsList:[Comments], myFundedProjectsList:[]
});
但是后来我在我的网站上注册登录后,数据库插进来一个奇怪的字段:__v:0
我插入一条数据后:显示如下结果:
我并没有插入__v从始至终,不知道大家遇到没
在使用 Mongoose 时,你可能会遇到一些看似“奇怪”的行为。其中一个常见的问题是 __v
字段的自动添加。这是 Mongoose 自动版本化的功能,用于处理并发问题。当你定义了一个 schema,并且设置了 versionKey: false
时,Mongoose 会默认添加一个 __v
字段来存储版本号。
示例代码
const mongoose = require('mongoose');
const { Schema } = mongoose;
// 定义 Comments schema
const Comments = new Schema({
projectName: String,
comment: String,
created_at: Date
});
// 定义 User schema
const UserSchema = new Schema({
userId: Schema.Types.ObjectId,
username: String,
password: String,
userAccountId: Schema.Types.ObjectId,
userAccountSummary: { type: String, default: "1000" },
myProjectsList: [],
myCommentsList: [Comments],
myFundedProjectsList: []
}, {
versionKey: false // 关闭自动版本化
});
const User = mongoose.model('User', UserSchema);
// 连接到 MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('Connected to MongoDB'))
.catch(err => console.error('Failed to connect to MongoDB', err));
// 插入一条用户数据
const newUser = new User({
userId: new mongoose.Types.ObjectId(),
username: 'testuser',
password: 'testpass',
userAccountId: new mongoose.Types.ObjectId()
});
newUser.save()
.then(savedUser => console.log('User saved:', savedUser))
.catch(err => console.error('Error saving user:', err));
解释
- 版本化:Mongoose 默认会在每个文档中添加一个
__v
字段来存储版本号。这有助于解决并发更新问题。 - 禁用版本化:如果你不希望 Mongoose 添加
__v
字段,可以在创建 schema 时设置versionKey: false
。
结果
通过上述代码,你可以看到 __v
字段没有被添加到你的文档中。这样可以避免出现你提到的奇怪的字段。
注意事项
- 如果你需要版本化,可以保留
__v
字段。 - 如果你不希望有
__v
字段,确保在 schema 中设置versionKey: false
。 - 确保你的 MongoDB 连接正确配置,并且你使用的 Mongoose 版本是最新的。
希望这些信息能帮助你解决问题!
默认会多插入一个_id 没发现会插入一个_v 你再检查一下,肯定是插了
检查过了,遵循上面的schema没有问题啊
检查过了,遵循上面的schema没有问题啊
sdaasdfasdf asdfasdf
哎,多看api啊,_id是默认配置上去的,即便你不写,也会有,如果你重新指定id,那么原有的_id也就没有了,会显示新的主键id。至于这个__v,你回想你写过哪些程序会有v这个符号,例如“nodejs -v”或者“npm -v”或者“java -version”,对了,v代表的就是版本,__v也是默认配置上去的,用来表示版本信息的,当然这个你也可以去掉,具体的查看api去。多看api,下次要是看见多了几个文档例如“system.indexes”或者“system.users”等千万不要惊讶。
哥们用心良苦啊 一早上就看到多个你回复的帖子 真是热心啊
你能看见多插入了一个_v,为什么就没发现还多插入了一个_id呢?呵呵,这都是默认就会插入的
默认会插入id,谁应该都知道,但是插入这个_v是第一次碰到,弄了这么多天还是第一次碰到,
十分感谢,id我知道,我只是说_v,不是每一种插入都会有_v的,它不是默认的
这是 mongoose 给你加入的。
mongoose大家在windows能运行吗
3Q
在使用 Mongoose 时,__v
字段是默认自动添加的,用于版本管理(version key)。当你定义一个 Schema 时,Mongoose 默认会启用 versionKey
,以确保文档的一致性。如果你不希望 __v
字段出现,可以显式地禁用它。
示例代码
const mongoose = require('mongoose');
const { Schema } = mongoose;
// 定义 Comments schema
const Comments = new Schema({
projectName: String,
comment: String,
created_at: Date
}, { versionKey: false }); // 禁用版本键
// 定义 User schema
const UserSchema = new Schema({
userId: Schema.Types.ObjectId,
username: String,
password: String,
userAccountId: Schema.Types.ObjectId,
userAccountSummary: { type: String, default: '1000' },
myProjectsList: [],
myCommentsList: [Comments],
myFundedProjectsList: []
}, { versionKey: false }); // 禁用版本键
const User = mongoose.model('User', UserSchema);
// 插入一条数据
const newUser = new User({
userId: mongoose.Types.ObjectId(),
username: 'testuser',
password: 'password123',
userAccountId: mongoose.Types.ObjectId()
});
newUser.save((err, user) => {
if (err) {
console.error(err);
} else {
console.log(user);
}
});
解释
- 在定义
Comments
和UserSchema
时,增加{ versionKey: false }
选项来禁用__v
字段。 - 这样,在保存数据时就不会出现
__v
字段了。 - 如果你需要版本管理功能,可以选择其他方法进行版本控制。
通过这种方式,你可以避免 __v
字段的自动添加,同时保留其他功能。