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 我插入一条数据后:显示如下结果: enter image description here

我并没有插入__v从始至终,不知道大家遇到没


14 回复

在使用 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));

解释

  1. 版本化:Mongoose 默认会在每个文档中添加一个 __v 字段来存储版本号。这有助于解决并发更新问题。
  2. 禁用版本化:如果你不希望 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大家在windows能运行吗

在使用 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);
  }
});

解释

  • 在定义 CommentsUserSchema 时,增加 { versionKey: false } 选项来禁用 __v 字段。
  • 这样,在保存数据时就不会出现 __v 字段了。
  • 如果你需要版本管理功能,可以选择其他方法进行版本控制。

通过这种方式,你可以避免 __v 字段的自动添加,同时保留其他功能。

回到顶部