mongodb数据库使用

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: mongodb数据库使用

一、下载安装

不同版本的下载安装方式不同,大家根据所需版本百度安装

官网MongoDB: The Developer Data Platform | MongoDB

二、基本概念

一种数据库,而且是非关系型数据库。可以快速开发web型应用,因为灵活,不用像关系型数据库一样需要建表,MongoDB存储的是文档(document),文档内存储的是类似json的结构

2、mongo中的几个概念

  • 数据库 database
  • 集合(数组) collection
  • 类似与SQL中的数据表,本质上是一个数组,里面包含看多个文档对象,[{},{},{}]
  • 文档对象 document
  • 类似与SQL中的记录,一个文档对象{}就是一条记录
  • 一个数据库由多个集合构成,一个集合包含多个文档对象。

3、基本使用

  • show dbs 或show databases
  • 查看所有的数据库
  • use xxx
  • 切换到指定的数据库
  • db
  • 查看当前操作的数据库
  • show collections
  • 查看当前数据库中所有的集合

MongoDB关系: 数据库(database) > 集合(collection)> 文档(document)

值得注意的是: 在MongoDB中不需要自己创建数据库和集合,便可以直接创建文档,其实就是在创建文档的同时,会将数据库和集合创建了。

4、mongodbmanagerfree

mongodb 可视化工具下载路径

Download NoSQL Manager for MongoDB Freeware

三、 数据库的CRUD操作

具体内容查看官方文档: https://mongoosejs.com/

核心: 增: insert() 删: remove() 查: find() 改: update()

1、增加

db.collection.insert()

向集合中插入一个或多个文档,当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动给文档添加_id,该属性用来作为文档的唯一标识,_id可以自己指定,如果我们指定了,数据库就不会再添加了,如果自己指定_id必须也确保唯一性

db.collection.insertOne():插入一个文档对象

db.collection.insertMany():插入多个文档对象

db.piyou.insert({name: "孙悟空", age: 28, address:"花果山"});
/*
  表示向 集合名为piyou插入了文档, 文档内容是对象。
  集合名是自己创建的,想用什么名称就用什么。
*/
 
db.piyou.insert([
  {name:"猪八戒", age: 38, address:"高老庄"}, 
  {name: "沙和尚", age: 45, address:"流沙河"}
]);
/*
  可以注意到: 传递的数据是数组,数组内部是对象,
    其实对象就相当于文档,这就是插入了两个文档。
*/
 
 
#添加两万条数据
for(var i=0;i<20000;i++){
  db.users.insert({username:'liu'+i}) #需要执行20000次数据库的添加操作
}
db.users.find().count()//20000
 
 
#优化:
var arr=[];
for(var i=0;i<20000;i++){
  arr.push({username:'liu'+i})
}
db.user.insert(arr) #只需执行1次数据库的添加操作,可以节约很多时间

$push:用于向数组中添加一个新的元素

db.user.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}})

$addToSet:向数组中添加一个新元素(类似于向set集合中添加,如果数组中已经存在了该元素,则添加失败,因为不可重复)

db.user.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}})

2、查询

db.collection.find()

  • db.collectionName.find() 或db.collectionName.find({})
  • 查询集合所有的文档,即所有的数据。
  • 查询到的是整个数组对象。在最外层是有一个对象包裹起来的。
  • db.collectionName.count()或db.collectionName.length() 统计文档个数
  • db.collectionName.find({_id:222})
  • 条件查询。注意:结果返回的是一个数组
  • db.collectionName.findOne() 返回的是查询到的对象数组中的第一个对象

注意

> db.students.find({_id:222}).name  //错误
> db.students.findOne({_id:222}).name //正确

 

# 1.mongodb支持直接通过内嵌文档的属性值进行查询
# 什么是内嵌文档:hobby就属于内嵌文档
{
  name:'liu',
  hobby:{
    movies:['movie1','movie2'],
    cities:['zhuhai','chengdu']
  }
}
 
db.users.find({hobby.movies:'movie1'}) //错误
db.users.find({"hobby.movies":'movie1'})//此时查询的属性名必须加上引号
 
 
 
#2.查询操作符的使用
#比较操作符
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$eq 等于的另一种写法
 
db.users.find({num:{$gt:200}}) #大于200
db.users.find({num:{$gt:200,$lt:300}}) #大于200小于300
 
$or 或者
db.users.find(
    {
        $or:[
            {num:{$gt:300}},
            {num:{$lt:200}}
        ]
    }
) #大于300或小于200
 
 
#3.分页查询
db.users.find().skip(页码-1 * 每页显示的条数).limit(每页显示的条数)
 
db.users.find().limit(10) #前10条数据
db.users.find().skip(50).limit(10) #跳过前50条数据,即查询的是第61-70条数据,即第6页的数据
 
 
#4.排序
db.emp.find().sort({sal:1}) #1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1}) #先按照sal升序排列,如果遇到相同的sal,则按empno降序排列
 
#注意:skip,limit,sort可以以任意的顺序调用,最终的结果都是先调sort,再调skip,最后调limit
 
#5.设置查询结果的投影,即只过滤出自己想要的字段
db.emp.find({},{ename:1,_id:0}) #在匹配到的文档中只显示ename字段
 
 
 
 

3、修改

# 1.替换整个文档
# db.collectionName.update(condiction,newDocument)
 
> db.students.update({_id:'222'},{name:'kang'})
 
 
# 2.修改对应的属性,需要用到修改操作符,比如$set,$unset,$push,$addToSet
db.collectionName.update(
  # 查询条件
  {_id:222},
  {
    #修改对应的属性
    $set:{ 
      name:'kang2',
      age:21
    }
    #删除对应的属性
    $unset:{
      gender:1 //这里的1可以随便改为其他的值,无影响
    }
    
  }
)
 
# 3.update默认与updateOne()等效,即对于匹配到的文档只更改其中的第一个
# updateMany()可以用来更改匹配到的所有文档
db.students.updateMany(
  {name:'liu'},
  {
    $set:{
      age:21,
      gender:222
    }
  }
)
 
 
# 4.向数组中添加数据
db.users.update({username:'liu'},{$push:{"hobby.movies":'movie4'}})
 
#如果数据已经存在,则不会添加
db.users.update({username:'liu'},{$addToSet:{"hobby.movies":'movie4'}})
 
 
# 5.自增自减操作符$inc
{$inc:{num:100}} #让num自增100
{$inc:{num:-100}} #让num自减100
db.emp.updateMany({sal:{$lt:1000}},{$inc:{sal:400}}) #给工资低于1000的员工增加400的工资

4、删除

# 1. db.collectionName.remove() 
# remove默认会删除所有匹配的文档。相当于deleteMany()
# remove可以加第二个参数,表示只删除匹配到的第一个文档。此时相当于deleteOne()
db.students.remove({name:'liu',true})
 
# 2. db.collectionName.deleteOne()
# 3. db.collectionName.deleteMany()
db.students.deleteOne({name:'liu'})
 
# 4. 删除所有数据:db.students.remove({})----性格较差,内部是在一条一条的删除文档。
# 可直接通过db.students.drop()删除整个集合来提高效率。
 
# 5.删除集合
db.collection.drop()
 
# 6.删除数据库
db.dropDatabase()
 
# 7.注意:删除某一个文档的属性,应该用update。   remove以及delete系列删除的是整个文档
 
# 8.当删除的条件为内嵌的属性时:
db.users.remove({"hobby.movies":'movie3'})

四、文档之间的关系

1、一对一(one to one)

在MongoDB中,可以通过内嵌文档的形式来体现出一对一的关系

db.WifeAndHusband.insert([
    {
        wife:"黄蓉",
        husband:{
            name:"郭靖"
        }
    },
    
    {
        wife:"潘金莲",
        husband:{
            name:"武大郎"
        }
    }
    
])

2、一对多(one to many)/ 多对一(many to one)

一对多:父母和孩子、用户和订单、文章和评论,也可以通过内嵌文档的方式来映射一对多的关系(将1的那个属性设置为多的里面的字段)

db.order.insert({
  list:["watermelor"],
    user_id:ObjectId("5f87b1deda684b252c2fc7a5")
})
 
var user_id = db.users.findOne({username:"swk"})._id
//查询孙悟空的订单
db.order.find({user_id:user_id})

3、多对多(many to many):分类和商品,通过内嵌文档的方式

db.teacher.insert([
  {name:"洪七公"},
    {name:"黄药师"},
    {name:"龟仙人"}
])
 
db.stus.insert([
    {
        name:"郭靖",
        tech_ids:[
            ObjectId("5f87b4b6da684b252c2fc7a8"),
            ObjectId("5f87b4b6da684b252c2fc7a9")
        ]
    },   
    {
        name:"孙悟空",
        tech_ids:[
            ObjectId("5f87b4b6da684b252c2fc7a8"),
            ObjectId("5f87b4b6da684b252c2fc7a9"),
            ObjectId("5f87b4b6da684b252c2fc7aa")
        ]
    }
])

练习

//查询工资小于1000或者大于2000的员工
db.emp.find( $or:[ {sal:{$lt:1000}},{sal:{$gt:2500}} ])
 
//为所有工资小于1000的增加400
db.emp.find({sal:{$lte:1000}},  {$inc:{$sal:400}})

五、mongoose

1、什么是mongoose

一般我们不会直接用MongoDB的函数来操作MongoDB数据库 , 而Mongose就是一套操作MongoDB数据库的接口。 简而言之就是:mongoose也可以操作mongodb数据库,而且它来操作数据库会有更多好处

2、mongoose中的对象:

  • Schema 模式对象(用于约束文档的结构)
  • Model 模型对象(即mongodb中的集合)
  • Document 文档对象(即mongodb中的文档)

3、安装

npm i -s mongoose

4、连接数据库

// 1.引入mongoose
const mongooes = require("mongoose");
// 2.连接mongodb数据库
mongooes.connect("mongodb://localhost/users", {
    useNewUrlParser: true,
    useUnifiedTopology: true,
});
 
// 3.监听mongodb数据库的连接状态
// 绑定数据库连接成功事件
mongooes.connection.once("open", function () {
    console.log("连接成功");
});
// 绑定数据库连接失败事件
mongooes.connection.once("close", function () {
    console.log("数据库连接已经断开");
});
 
// 4.断开数据库连接(一般不用)
mongooes.disconnect();

5、创建模式对象和模型对象

const Schema=mongooes.schema;
//创建模式对象
const stuSchema=new Schema({
    name:String,
    age:Number,
    gender:{
        type:String,
        default:'female'
    },
    address:String
})
//创建模型对象
const StuModel=stuSchema.model("student",stuSchema); //第一个参数表示创建的集合的名称,第二个参数表示利用的模式对象

6、利用模型对象进行增删查改操作

添加

UserModel.create({ user_id: 100, name: "liu1" }, function (err) {
  if (!err) {
    console.log("插入成功");
  } else {
    console.log(err);
  }
});
 
let data = [
  { user_id: 101, name: "liu2", age: 22 },
  { user_id: 102, name: "liu3" },
];
UserModel.create(data, function (err) {
  console.log(arguments[1]); //第二个值表示的是所添加的文档对象,是一个数组
});

查询

/* 
    查询:
    model.find(conditions,[projection],[options],callback)
    conditions:查询的条件 
    projection:投影  { name: 1, gender: 1, _id: 0 } 或 'name gender -_id'
    options:查询选项  { skip: xx, limit: xx }   
 
    model.findOne(...)
    model.findById(...)
    model.countDocuments(conditions,callback) 查询文档的数量
 */
 
UserModel.find({}, function (err, data) {
  console.log(data);
});
UserModel.find(
  { name: /liu/i },
  "name gender -_id",
  { skip: 2, limit: 1 },
  function (err, data) {
    console.log(data); //返回的是一个文档对象数组
  }
);
 
UserModel.findById("5f9fbfba14319e492c0f5bc4", function (err, data) {
  console.log(data);
  console.log(data instanceof UserModel); //true 返回的文档对象属于模型对象(即集合)的实例对象
});
 
UserModel.countDocuments({}, function (err, data) {
  console.log(data);
});

删除

/* 
删除:
model.remove(conditions,callback)
model.deleteOne(...)
model.deleteMany(...)
*/
UserModel.remove(
  {
    name: "liu2",
  },
  function (err, data) {
    console.log("删除成功");
  }
);
UserModel.find({}, function (err, data) {
  console.log(data);
});

修改

/* 修改:
    model.update(conditions,[doc],[options],callback)
        doc:修改后的文档对象
    model.updateMany(...)
    model.uodateOne(...)
*/
UserModel.updateOne({ name: "liu1" }, { $set: { age: 22 } }, function (
  err,
  data
) {
  if (!err) {
    console.log("修改成功");
  }
});
 
UserModel.find({ name: "liu1" }, function (err, data) {
  console.log(data);
});

7、模块化处理

单独创建一个数据库连接文件dbconncet.js

const mongooes = require("mongoose");
mongooes.connect("mongodb://localhost/mongooes_test", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
mongooes.connection.once("open", function () {
  console.log("连接成功");
});

为每一个集合创建一个模型对象文件xxxModel.js

const mongooes = require("mongoose");
const Schema = mongooes.Schema;
const userSchema = new Schema({
  user_id: String,
  name: String,
  age: Number,
  gender: {
    type: Number,
    default: 0,
  },
});
const UserModel = mongooes.model("user", userSchema);
module.exports = UserModel;

在最终的文件index.js中引入数据库连接文件和创建模型的文件

const mongooes = require("./dbconncet");
const PostModel = require("./models/postModel");
 
PostModel.findOne({}, function (err, data) {
  if (!err) {
    console.log(data);
  }
});


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
14天前
|
运维 监控 NoSQL
【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
33 4
|
18天前
|
监控 NoSQL MongoDB
MongoDB数据库的索引管理技巧
【8月更文挑战第20天】MongoDB数据库的索引管理技巧
37 1
|
18天前
|
监控 NoSQL MongoDB
mongodb数据库 使用技巧
【8月更文挑战第20天】mongodb数据库 使用技巧
33 1
|
23天前
|
JSON NoSQL Ubuntu
在Ubuntu 14.04上如何备份、恢复和迁移MongoDB数据库
在Ubuntu 14.04上如何备份、恢复和迁移MongoDB数据库
45 1
|
7天前
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
28 0
|
7天前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
19 0
|
23天前
|
JSON NoSQL MongoDB
在Ubuntu 14.04上如何导入和导出MongoDB数据库
在Ubuntu 14.04上如何导入和导出MongoDB数据库
12 0
|
16天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
69 2
|
11天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
15天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
下一篇
DDNS