MongoDB是一种非关系型数据库,它以文档的形式存储数据。文档是由键值对组成的数据结构,类似于JSON对象。MongoDB中的文档可以有不同的结构和字段,这给数据的灵活性和多样性带来了优势,但也可能导致数据的不一致性和冗余性。为了解决这个问题,MongoDB提供了一种叫做Schema的机制,它可以用来定义文档的结构和验证规则。Schema可以帮助我们保证文档的格式和类型,以及对某些字段进行必填、唯一、枚举等限制。除此之外,Schema还可以让我们为某些字段设置默认值,这样当我们插入或更新文档时,如果没有指定这些字段的值,就会自动使用默认值。这样可以避免数据缺失或错误,也可以减少代码的复杂度和重复性。
在本文中,我们将介绍如何使用Schema来定义默认值,以及在什么情况下使用默认值是有意义的。
首先,我们需要安装并引入mongoose模块,它是一个基于MongoDB的对象模型工具,它可以让我们更方便地使用Schema和其他功能。我们可以使用npm命令来安装mongoose:
然后,在我们的代码中引入mongoose,并连接到MongoDB数据库:
接下来,我们需要定义一个Schema对象,它可以接受一个参数,即一个对象,该对象包含了我们想要定义的文档结构和规则。例如,我们想要定义一个用户(User)文档,它包含了用户名(username)、密码(password)、邮箱(email)、注册时间(createdAt)和最后登录时间(lastLoginAt)等字段。我们可以这样定义一个Schema:
在上面的代码中,我们为每个字段指定了类型(type)、是否必填(required)、是否唯一(unique)、以及其他验证规则(validate)。其中,对于createdAt和lastLoginAt这两个字段,我们还指定了默认值(default)。对于createdAt字段,我们使用了Date.now这个函数作为默认值,它会返回当前时间的毫秒数。这样当我们创建一个用户文档时,如果没有指定createdAt字段的值,就会自动使用当前时间作为该字段的值。对于lastLoginAt字段,我们使用了null作为默认值,表示该用户还没有登录过。这样当我们更新一个用户文档时,如果没有指定lastLoginAt字段的值,就会保持原来的值不变。
接下来,我们需要使用Schema对象来创建一个Model对象,它可以让我们对数据库中的文档进行增删改查等操作。我们可以这样创建一个Model对象:
在上面的代码中,我们使用mongoose.model这个函数来创建一个Model对象,它接受两个参数,即文档的名称(User)和对应的Schema对象(userSchema)。注意,文档的名称应该是单数形式,mongoose会自动将其转换为复数形式作为集合的名称(users)。
现在,我们可以使用Model对象来创建和更新用户文档了。例如,我们想要创建一个新的用户文档,我们可以这样做:
在上面的代码中,我们使用new关键字和Model对象来创建一个新的用户文档,并给它赋值一些字段。注意,我们没有给createdAt和lastLoginAt这两个字段赋值,因为它们有默认值。然后,我们使用save方法来将该文档保存到数据库中,并传入一个回调函数来处理错误或结果。如果保存成功,我们可以看到输出的结果如下:
可以看到,该文档有一个自动生成的唯一标识符(_id),以及我们赋值的字段。另外,也可以看到createdAt字段被自动赋值为当前时间,而lastLoginAt字段被自动赋值为null。
接下来,假设该用户登录了一次,我们想要更新该用户文档的lastLoginAt字段为当前时间,我们可以这样做:
在上面的代码中,我们使用findOneAndUpdate方法来查找并更新一个用户文档,它接受四个参数,即查询条件({username: 'Alice'})、更新内容({lastLoginAt: Date.now()})、选项({new: true})和回调函数。选项中的new表示返回更新后的文档,默认为false。如果更新成功,我们可以看到输出的结果如下:
可以看到,该文档的lastLoginAt字段被更新为当前时间。