MongoDB 基本使用

MongoDB 相关术语

在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)。

术语解释说明
database数据库,mongoDB数据库软件中可以建立多个数据库
collection集合,一组数据的集合,可以理解为JavaScript中的数组 (一个表)
document文档,一条具体的数据,可以理解为JavaScript中的对象 (一条数据 行)
field字段,文档中的属性名称,可以理解为JavaScript中的对象属性

数据库的连接

使用mongoose提供的connect方法即可连接数据库

const mongoose = require('mongoose')

mongoose.connect('mongodb://localhost/user', { useNewUrlParser: true ,useUnifiedTopology: true})
    .then(() => console.log('数据的连接成功'))
    .catch(err=> console.log('数据的连接失败', err))

在MongoDB中不需要显式创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建

创建集合(数据表)

  1. 设定集合规则,使用mongoose的Schema方法
  2. 创建集合 ,mongoose.model
// 设置集合规则
const courseSchema = new mongoose.Schema({
    name: String,
    author: String,
    age: Number,
    isPublished: Boolean  
})
// 创建集合并使用定义的集合规则
// 返回一个构造函数
// 在数据库中创建一个叫courses的集合(表)
const Course = mongoose.model('Course', courseSchema)

创建文档

创建文档即为向集合中插入数据]

方法一:

步骤:

  1. 创建集合实例
  2. 调用实例对象下的save方法将数据保存到数据库中
// 创建集合实例
const course = new Course({
    name: 'Node.js',
    author: 'hyy',
    age: 18,
    isPublished:true
})
// 将数据保存到数据库中
course.save()
 

方法二

create为异步API,使用回调函数输出结果

Course.create({ name: 'Node.js', author: 'hyy', age: 18, isPublished: true }, (err, doc) => {
    console.log(err); // 创建成功err为null
    console.log(doc);  // 插入的数据
})

mongodb下的api也支持Promise

Course.create({ name: 'Node.js', author: 'hyy', age: 18, isPublished: true })
    .then(doc => console.log(doc))
    .catch(err => console.log(err))

数据库导入数据

mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
mongoimport -d test -c users --file user.json

MongoDB 增删改查操作

查询

  1. 查询所有
User.find().then(result => console.log(result))
  1. 查询所有满足条件的数据
User.find({ age: 20 }).then(result => console.log(result))
  1. 查询满足条件的一条数据,默认返回第一条
User.findOne({ age: 20 }).then(result => console.log(result))

4.查询集合中字段取值在某区间的文档, g t 、 gt、 gtlt的使用

User.find({age:{$gt:15,$lt:30}}).then(result => console.log(result))
  1. 查询集合中数组字段值包含某值的文档
User.find({ hobbies :{$in:['足球']}}).then(result => console.log(result))
  1. 选择要查询的字段
User.find().select('neme age').then(result => console.log(result))
  1. 查询的数据进行排序
// 升序
User.find().sort('age').then(result => console.log(result))
// 降序排序
User.find().sort('-age').then(result => console.log(result))
  1. 查询文档跳过前几条结果 限制显示结果条数
    可运用到页面分页显示中
User.find().skip(2).limit(3).then(result => console.log(result))

删除

  1. 删除满足条件的一条数据
User.findOneAndDelete({}).then(result => console.log(result))
  1. 删除满足条件的多条数据
User.deleteMany({}).then(result => console.log(result))

更新

1.修改满足条件的一条数据

// 第一个参数为查询条件
// 第二个参数为修改的值
User.updateOne({name: '李四'}, {age: 120, name: '李狗蛋'}).then(result => console.log(result))

2.修改满足条件的多条数据

User.updateMany({}, {age: 300}).then(result => console.log(result))

mongoose验证

1.required: true 必传字段

2.minlength:3 字符串最小长度

3.maxlength: 20 字符串最大长度

4.min: 2 数值最小为2

5.max: 100 数值最大为100

6.enum: [‘html’, ‘css’, ‘javascript’, ‘node.js’]

7.trim: true 去除字符串两边的空格

8.validate: 自定义验证器

9.default: 默认值

const mongoose = require('mongoose')

mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true ,useUnifiedTopology: true})
    .then(() => console.log('数据的连接成功'))
    .catch(err => console.log('数据的连接失败', err))

const postSchema = new mongoose.Schema({
    name: {
        type: String,
        //必传字段
        required:[ true,'请传入文章标题'],
        // 字符串最短长度
        minlength: [2,'名字长度不能小于2'],
        // 字符串最短长度
        maxlength: [5,'名字长度不能大于5'],
        // 去除字符串两边的空格
		trim: true
    } ,
    age: {
        type: Number,
        // 最小值
        min: 10,
        // 最大值
        max:100
    },
    email: {
        type: String,
        
    },
    category:{
        type: String,
        // 枚举 列举出当前字段可以拥有的值
        enum: {
            values: ['html', 'css', 'javascript', 'vue'],
            // 错误提示信息
            message:'传入的分类不符合'
        }
    },
    author: {
		type: String,
		validate: {
			validator: v => {
				// 返回布尔值
				// true 验证成功
				// false 验证失败
				// v 要验证的值
				return v && v.length > 4
			},
			// 自定义错误信息
			message: '传入的值不符合验证规则'
		}
    },
    date: {
        type: Date,
        // 设置默认值
        default:Date.now
    }
});

const post = mongoose.model('Post', postSchema)

post.create({ name: 'a', age: 60, category: 'css', author: 'bd' })
    .then(result => console.log(result))
    .catch(error => {
        const err = error.errors
        // 错误提示信息打印
        for (var attr in err) {
            console.log(err[attr]['properties']['message'])
        }
    })

集合关联

const mongoose = require('mongoose')

mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true ,useUnifiedTopology: true})
    .then(() => console.log('数据的连接成功'))
    .catch(err => console.log('数据的连接失败', err))
// 定义用户规则
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required:true
    }
})
// 定义文章规则
const postSchema = new mongoose.Schema({
    title: {
        type: String,
        required:true
    },
    author: {
        // 使用ID将文章集合和作者集合进行关联
        type: mongoose.Schema.Types.ObjectId,
        ref:'User'
    }
})
// 创建用户集合
const User = mongoose.model('User', userSchema)
// 创建文章集合
const Post = mongoose.model('Post',postSchema)

// 添加用户数据
 User.create({ name: 'lisi' }).then(result => console.log(result))
// 添加文章数据
Post.create({title:'html',author:'5fffff0f21212c2894416b37'}).then(result => console.log(result))
// 联合查询
Post.find()
    .populate('author')
    .then(result => console.log(result))

输出结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值