mongodb查询不带表名_MongoDB笔记

mongoDB非常灵活,让我们脱离SQL语句来操作数据库
它是动态的数据库,不需要提前设定表结构,只需要执行代码像操作对象一样操作数据即可
建库等过程是自动实现的
MongoDB 教程 | 菜鸟教程​www.runoob.com
cc2c1d8f39ba4d4055a0528bc50a89f1.png

一. 关系型数据库和非关系型数据库

  • 表就是关系,表与表之间存在关系
  • 所有关系型数据库都需要设计表结构
  • 关系型数据库支持约束 如 唯一 主键 默认值 非空 等等
  • 非关系型数据库非常灵活
  • 好多非关系型数据库就是键值对
  • 但是MongoDB是长得最像关系型的非关系型
  • 对MongoDB来说: 数据库 --> 数据库
  • 数据表 --> 集合(可以想象成一个数组)
  • 表记录 --> 文档对象(可以想象成数组存入的对象)
  • MongoDB无需设计表结构
  • 也就是说: 可以任意存入数据,没有结构这一说

mongodb数据库服务就像一个大对象,里面是一个个的数据库,每个数据库中都有几个集合(列表),每个集合(列表)中都是一对对的键值对数据对象

429256e33bb0d3c8a32c306f589426e7.png

二.安装

Download Center: Community Server​www.mongodb.com
c8c31d443dfb7b8d66899847900377b8.png

下载安装,然后配置环境变量

eaf44b85f7baceb928a970c1fa50f6f1.png

然后打开cmd确认一下,输入 mongod --version

e38f43157c2f7e30f12413371d150c81.png

三. 启动和停止数据库服务

1.启动数据库服务

在启动之间先新建一个文件夹 C:datadb,

然后控制台输入:

mongod

c4a8bad2e56370bc3377a235f38bdafb.png

2.关闭数据库服务

1.开启服务的控制台,直接ctrl+c即可停止
2.直接关闭控制台

3.连接数据库

在新的CMD中

mongo   //默认连接本机数据库

72cd6e929e590c26972a7a8a658f59e9.png

4.断开数据库连接

exit

307408c4975c60b8254f0fd7edc02e60.png

四. 基本命令

  1. 显示数据库列表
show dbs   //显示所有数据库

2. 查看当前连接的数据库

db

90f15ab428568b91f558289d7181c514.png

3. 创建新数据库/使用数据库

use 数据库名   //这条命令会切换到某数据库,如果这个数据库不存在,会新建(有数据的瞬间新建)

4. 插入数据

不需要建表,直接写数据 (其实,系统会根据您的命令创建集合,并往集合里写入数据)

db.students.insertOne({"name":"Tom"})

0ab5cdd1f2839f6dd85caa76d36cd78f.png

5. 显示集合

show collections

1fed1f0c3e028bdf5ab1cf9328c8eac8.png

6. 查询集合中的所有数据

db.students.find()

203a7840a084bea5630108606a672d3b.png

7.增删改查

增:见第七节

查:见第八节

删:见第九节

改:见第十节

五.如何通过node-js操作mongo-db

1.使用官方包mongodb操作(原生的,不推荐使用)

$ npm install mongodb --save

2.使用第三方mongoose来操作

mongoose是基于上述官方包的二次封装.

mongodb是动态的,非常灵活,只需要在 代码中设计数据库,mongoose可以让你的设计编写变得非常简单

Mongoose.js中文网​www.mongoosejs.net

安装:

cnpm i mongoose --save

使用:

const mongoose = require('mongoose');
//引包
mongoose.connect('mongodb://localhost/test');
//连接数据库

//创建一个模型(设计数据库) 
const Cat = mongoose.model('Cat', { name: String });
//表名是cats(里面都是Cat,所以表名是cats) (*^_^*)
//要求里面有一个属性name,类型为字符串

//实例化一个数据
const kitty = new Cat({ name: 'Zildjian' });
//实例了一个小猫kitty,它的名字是Zildjian

//持久化保存这个示例
kitty.save().then(() => console.log('meow')); 

b509ee98fce8ac929ef5d6b356c3b7f4.png
最后一行的猫叫,代表存储成功

接下来解决上面的两个提醒,

看了看是方法将被弃用,应该使用新方法,如果使用新方法,在构建连接时要传入对应的参数,

那就传吧

mongoose.connect('mongodb://localhost/test',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{
    if(err) return console.log('connection ERR:'+err);
    return console.log('connection success');
});

1a7c88001c652ac8d95dd15667e8e4f4.png
解决了

简单查询一下:

3d75f535f19cb972972653373753ac88.png

六 如何使用mongoose来设计数据库

1.引包

const mongoose = require('mongoose');

2.连接数据库(没有会新建)

mongoose.connect('mongodb://localhost/db2',{useNewUrlParser:true,useUnifiedTopology:true},
(err)=>{
    if(err) return console.log('connection ERR:'+err);
    return console.log('connection success');
});

3.设计表结构

①.先拿到mongoose的架构模型

var Schema = mongoose.Schema

②.在实例化一个数据模型

var studentSchema = new Schema({
    name: String,
    age: Number,
    gender: Number,
    school: String,
    hidden: Boolean,
    reward: [{ rewardName: String, date: { type: Date, default: Date.now } }],
})

但是,这样设计约束太少了!!!让我们来看约束版本:

    name: {
        type: String,
        required: true,
    },

③ 将文档结构发布为模型

var Student=mongoose.model('student',studentSchema)//模型,不是模块.这里要注意单词model

将一个架构发布为一个模型,第一个参数传入一个大写单数字符串,最终mongoose会自动生成一个小写复数的集合(数据表). 可以认为是创建了一个可以持久化存储的类对象.

④ 有了这个类对象之后,我们就可以对数据为所欲为了~

4.模块化设计

我们创建一个model/user.js文件,专门来做数据库模型

const mongoose = require('mongoose');

var Schema = mongoose.Schema
var userSchema = new Schema({
    email: { type: String, required: true },
    nickname: { type: String, required: true },
    password: { type: String, required: true },
    created_time: { type: Date, default: Date.now },
                        //这里不要直接写 Date.now() 如果写了,模块执行时就会写死
    last_modified_time: { type: Date, default: Date.now },
    avatar: { type: String, default: '/public/img/avatar-default.png' },
    bio: { type: String, default: '' },
    gender: { type: Number, enum: [0, 1, -1], default: -1 },
    birthday: { type: Date },
    status: {
        type: Number, enum: [0,//正常用户
            1,//不可评论
            2,//不可登录
        ]
    },
})

module.exports = mongoose.model('User', userSchema)

在app.js中连接数据库

const mongoose = require('mongoose');

//mongoDB
mongoose.connect('mongodb://localhost/db3',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{
    if(err) return console.log('connection ERR:'+err);
    return console.log('connection success');
});

如果哪个地方想用它

var User=require('./models/user')

七 新增数据操作

1.创建一条数据 (实例化一个模型对象)

var stu1=Student({
    name:'oliver',
    age:18,
    gender:1,
    school:'湘北中学',
    hidden:false
})

2. 存储数据

stu1.save((err,ret)=>{
    if(err) return console.log('存储失败'+err);
    return console.log('存储成功'+ret)
})

f43458282e537fe4acc797fa0a6648e5.png

八 查询数据

1.查询所有

Student.find((err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

7398f89b8d258c63e9fc7898b9a99267.png

2.按条件查询

把条件封装成一个对象放在第一个参数即可

Student.find({name:"anny"},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

3.只找匹配的第一个

Student.findOne({name:"anny"},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

4.按ID查询

Student.findById('5e48ceb5047cfa2bcc970228',(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

5.多个条件查询

User.find({
        $or: [
            { email: req.body.email },
            { nickname: req.body.nickname }
        ]
    }, (err, data) => {})

九 删除数据

1.按条件删除

Student.deleteMany({name:'anny'},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

dcf3a0cb0f18071ceff624419ddaf229.png

2.按条件删除一个

Student.deleteOne({name:'anny'},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

还有一种方法

Student.findOneAndDelete({name:'anny'},(err,ret)=>{
    if (err) return console.log('失败'+err);
    return console.log('成功');
})

3.按ID查询然后删除

Student.findByIdAndDelete("5e48c7118967a217d09e7838", (err, ret) => {
    if (err) return console.log('失败'+err);
    return console.log('成功');
})

还有一种

Student.findByIdAndRemove("5e48ce979b24812260a0217d", (err, ret) => {
    if (err) return console.log('失败'+err);
    return console.log('成功');
})

十 修改数据

1.按ID查询然后修改

Student.findByIdAndUpdate('5e48c7118967a217d09e7838',{age:8},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

2.按条件查找然后修改

Student.updateMany({name:'anny'},{age:6},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

3.按条件查找一个然后修改

Student.updateOne({name:'anny'},{age:10},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

还有一种

Student.findOneAndUpdate({name:'anny'},{age:8},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

十一.可视化软件

The Smartest GUI Admin Tool for MongoDB​nosqlbooster.com Navicat for MongoDB | MongoDB 数据库管理和开发工具​www.navicat.com.cn
4d6f586efcef3532dc4903aeb398ecc0.png

十二.综合练习

我们将之前写的学生管理系统改为mongodb数据库

之前的版本:

https://github.com/zfdok/node_stu_mgr​github.com

需要的知识:

熊爸天下:node-js备忘(二)​zhuanlan.zhihu.com
zhihu-card-default.svg

修改后的版本:

https://github.com/zfdok/node_stu_mongoDB​github.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值