Skip to content

Mongodb #20

Description

@Wscats

安装配置

Win

Mongodb官网下载最新版本的Mongodb下载地址

下载msiwindow安装包,可以装到C盘或者D盘目录下

Mac

Github或者官网下载到电脑里面

或者直接进入/usr/local文件夹下载

# 进入 /usr/localcd /usr/local
# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-x.x.x.tgz
# 解压
sudo tar -zxvf mongodb-osx-x86_64-x.x.x.tgz
# 重命名为 mongodb 目录
sudo mv mongodb-osx-x86_64-x.x.x mongodb

安装完成后,我们可以把MongoDB的二进制命令文件目录(安装目录/bin)添加到PATH路径中

export PATH=/usr/local/mongodb/bin:$PATH

如果是从Github或者官网下载的,要先把它文件夹改名为mongodb,然后放到/usr/local目录下,然后再运行上面那一句命令,把bin目录添加到PATH路径中

//创建默认数据库文件夹
sudo mkdir -p /data/db //连接数据库
sudo mongod --dbpath /data/db
//如果mongod默认连接/data/db这个位置,不需要带--dbpath
sudo mongod 

配置

由于我是安装在D盘的环境下

D:\Program Files (x86)\MongoDB\Server\3.2\bin

所以在bin文件夹下找到mongod.exe命令,然后通过管理员执行mongod --dbpath x路径x,路径可以是任何地方,我这里选择在D盘的MongoDB目录下,当然路径不要包含特殊的字符串,比如Program Files (x86)也不行

mongod --dbpath D:\mongodb\data\db

image

命令行

经过上面的配置之后,就可以返回bin目录下找到mongo.exe命令,并管理员下执行,就可以出现mongodb的命令行模式

D:\Program Files (x86)\MongoDB\Server\3.2\bin

image

然后就可以使用下面的命令来测试了

db.help()//帮助db.stats()//统计

显示数据库

showdbs

检查当前选择的数据库

db

添加数据库

数据库名为数据库创建的名字,使用该命令后会默认切换到对应的数据库,并且在数据库中添加选项,数据库信息才显示,如果默认就有该数据库,那就是切换到对应的数据库里面

use数据库名

删除数据库

先切换到对应的数据库,然后再执行db.dropDatabase()删除该数据库

use数据库名//switched to db 数据库名db.dropDatabase()

显示集合

用一下命令可以检查创建的集合

showcollections

添加集合

在创建完数据库之后,我们就可以创建集合

db.createCollection(集合名字name,设置参数options[对象类型])

name是要创建的集合的名称。 options是一个文档,用于指定集合的配置

参数类型描述
nameString要创建的集合的名称
optionsDocument(可选)指定有关内存大小和索引的选项

options参数是可选的,因此只需要指定集合的名称。 以下是可以使用的选项列表:

字段类型描述
cappedBoolean(可选)如果为true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大大小时自动覆盖其最旧的条目。 如果指定true,则还需要指定size参数。
autoIndexIdBoolean(可选)如果为true,则在_id字段上自动创建索引。默认值为false。
size数字(可选)指定上限集合的最大大小(以字节为单位)。 如果capped为true,那么还需要指定此字段的值。
max数字(可选)指定上限集合中允许的最大文档数。

由于option是可选,我们也可以不带配置项创建集合

db.createCollection("mycollection")

删除集合

db.collection.drop()用于从数据库中删除集合

db.集合名.drop()

比如我们可以测试以下操作

db.createCollection("wscats")//创建名为wscats的集合showcollections//显示该数据库所有集合 wscatsdb.wscats.drop()//删除名为wscats的集合

查看文档

最简单查看文档的方法就是find(),会检索集合中所有的文档结果

db.集合名.find()

要以格式化的方式显示结果,可以使用pretty()方法。

db.集合名.find().pretty()

1.固值寻找

寻找age集合里面所有含有属性值为wscats的文档结果,相当于where name = 'wscats'

db.age.find({name:"wscats"})

2.范值寻找

操作语法示例等效语句
相等{:}db.age.find({"name":"wscats"}).pretty()where name = 'wscats'
小于{:{$lt:}}db.age.find({"likes":{$lt:50}}).pretty()where likes < 50
小于等于{:{$lte:}}db.age.find({"likes":{$lte:50}}).pretty()where likes <= 50
大于{:{$gt:}}db.age.find({"likes":{$gt:50}}).pretty()where likes > 50
大于等于{:{$gte:}}db.age.find({"likes":{$gte:50}}).pretty()where likes >= 50
不等于{:{$ne:}}db.age.find({"likes":{$ne:50}}).pretty()where likes != 50

3.AND和OR寻找

AND

在find()方法中,如果通过使用将它们分开传递多个键,则mongodb将其视为AND条件。 以下是AND的基本语法

寻找_id为1并且name为wscats的所有结果集

db.age.find({$and: [{"_id": 1},{"name": "wscats"}]})

OR

在要根据OR条件查询文档,需要使用$or关键字。以下是OR条件的基本语法

寻找name为corrine或者name为wscats的所有结果集

db.age.find({$or: [{"name": "corrine"},{“name“: "wscats"}]})

AND和OR等结合

相当于语句where title = "wscats" OR ( title = "corrine" AND _id < 5)

db.age.find({$or: [{"title": "wscats"},{$and: [{"title": "corrine"},{"_id": {$lte: 5}}]}]})

插入文档

文档的数据结构和JSON基本一样。
所有存储在集合中的数据都是BSON格式。
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON

要将数据插入到mongodb集合中,需要使用mongodb的insert()save()方法。

db.集合名.insert(document)

比如我们可以插入以下数据

db.wscats.insert({_id: 100,title: 'MongoDB Tutorials',description: 'node_tutorials',by: 'Oaoafly',url: 'https://github.com/Wscats/node-tutorial',tags: ['wscat','MongoDB','database','NoSQL','node'],num: 100,})

也可以支持插入多个,注意传入的是数组形式

db.wscats.insert([{_id: 100,title: ‘Hello’},{_id: 101,title: ‘World’}])

在插入的文档中,如果不指定_id参数,那么mongodb会为此文档分配一个唯一的ObjectId
要插入文档,也可以使用db.post.save(document)。如果不在文档中指定_id,那么save()方法将与insert()方法一样自动分配ID的值。如果指定_id,则将以save()方法的形式替换包含**_id**的文档的全部数据。

db.wscats.save({_id: 111,title: 'Oaoafly Wscats',})

更新文档

1.update()方法

寻找第一条title为wscats的值,并且更新值title为corrine和age为12

db.age.update({'title': 'wscats'},{$set: {'title': 'corrine','age': 12}})

默认情况下,mongodb只会更新一个文档。要更新多个文档,需要将参数multi设置为true,还可以配合find方法里面的各种复杂条件判断来筛选结果,然后更新多个文档

寻找所有title为wscats的值,并且更新值title为corrine和age为12

db.age.update({'title': 'wscats'},{$set: {'title': 'corrine','age': 12}},{multi: true})

2.save()方法

_id主键为3的文档,覆盖新的值,注意_id为必传

db.age.save({
'_id':3,
'title': 'wscats'
})

删除文档

删除主键_id为3的文档,默认是删除多条

db.age.remove({'_id':3})

建议在执行remove()函数前先执行find()命令来判断执行的条件是否正确

如果你只想删除第一条找到的记录可以设置justOne为1,如下所示

db.age.remove({...},1)

全部删除

db.age.remove({})

Limit与Skip方法

Limit

如果你需要在mongodb中读取指定数量的数据记录,可以使用mongodb的Limit方法,limit()方法接受一个数字参数,该参数指定从mongodb中读取的记录条数。

db.age.find().limit(数量)

Skip

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

db.age.find().limit(数量).skip(数量)//skip()方法默认值为0

所以我们在实现分页的时候就可以用limit来限制每页多少条数据(一般固定一个值),用skip来决定显示第几页(一个有规律变动的值)

排序

在mongodb中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列,注意记得是数字(1,-1)而非字符串。

1升序排列
-1降序排列
db.集合名.find().sort({键值(属性值):1})

age集合表重新根据_id主键进行降序排列

db.age.find().sort({"_id": -1})

Node.js连接

安装mongodb的模块

npminstallmongodb

1.连接数据库

varMongoClient=require('mongodb').MongoClient;//结尾是选择数据库名varDB_CONN_STR='mongodb://localhost:27017/wscats';MongoClient.connect(DB_CONN_STR,function(err,db){console.log("连接成功!");});

2.查询数据

注意查询回来的结果需要toArray来遍历处理

varMongoClient=require('mongodb').MongoClient;varDB_CONN_STR='mongodb://localhost:27017/wscats';MongoClient.connect(DB_CONN_STR,function(err,db){console.log("连接成功!");//选中age集合,并用find方法把结果集拿回来进行处理db.collection("age").find({title: "cba"}).toArray(function(err,result){if(err){console.log('Error:'+err);return;}console.log(result);});});

经过测试,读取大于100条的时候会出现报错官网解释,可以尝试用forEach代替

db.collection('pokemon').find({}).forEach(function(item){console.log(item)})

查询ID

查询自动生成的ObjectId

varObjectId=require('mongodb').ObjectId;let_id=ObjectId("5bcae50ed1f2c2f5e4e1a76a");db.collection('xxx').find({"_id": _id}).forEach(function(item){console.log(item)})

3.插入数据

insert函数第一个参数是需要插入的值(可以一个也可以多个),第二个参数是接受一个回调函数,当值插入成功后回返回插入值得一些关键信息,比如_id

varMongoClient=require('mongodb').MongoClient;varDB_CONN_STR='mongodb://localhost:27017/wscats';MongoClient.connect(DB_CONN_STR,function(err,db){console.log("连接成功!");db.collection("age").insert([{title: "插入的值A"},{title: "插入的值B"}],function(err,result){if(err){console.log('Error:'+err);return;}console.log(result)})});

4.更新数据

注意如果不加$set就是完全替换原来的那份(没有设置的属性值将会丢失),加上$set则只是更新对应的属性值,其余不做改变

varMongoClient=require('mongodb').MongoClient;varDB_CONN_STR='mongodb://localhost:27017/wscats';MongoClient.connect(DB_CONN_STR,function(err,db){console.log("连接成功!");db.collection("age").update({"_id": 1},{$set: {title: "你好,世界",skill: "js"}},function(err,result){if(err){console.log('Error:'+err);return;}//console.log(result);});});

5.删除数据

varMongoClient=require('mongodb').MongoClient;varDB_CONN_STR='mongodb://localhost:27017/wscats';MongoClient.connect(DB_CONN_STR,function(err,db){console.log("连接成功!");db.collection("age").remove({"_id": 1},function(err,result){if(err){console.log('Error:'+err);return;}//console.log(result);//关闭数据库db.close();});});

6.关闭数据库

db.close();

封装自定义模块

新建mongo.js写入以下代码,封装自定义模块,方便其他路由复用,注意assert是node自带的断言模块,用于测试代码,具体封装好的MongoDB增删查改的代码可以参考这里

参考

constMongoClient=require('mongodb').MongoClient;constassert=require('assert');consturl='mongodb://localhost:27017';constdbName='shop';functionquery(callback){MongoClient.connect(url,function(err,client){assert.equal(null,err);console.log("Connected successfully to server");constdb=client.db(dbName);callback(db);client.close();});}module.exports={
query
}

在路由文件中引入和使用

varmongo=require('./mongo.js')router.post('/addproduct',function(req,res,next){mongo.query(function(db){db.collection("product").insertMany([req.body],function(err,result){console.log("Inserted 1 document into the collection");res.send('respond with a resource');});})});

数据库管理

bin文件里面自带了mongodb导出导入备份和恢复的命令,我们可以根据情况使用

导出

命令作用
-d数据库名
-ccollection名
-o输出的文件名
--type输出的格式,默认为json
-f输出的字段,如果-type为csv,则需要加上-f "字段名"
sudomongoexport-ddbName-cstudents-o/usr/local/mongodb/users.json

导入

命令作用
-d数据库名
-ccollection名
--type导入的格式默认json
-f导入的字段名
--headerline如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
--file要导入的文件
sudomongoimport-ddbName-cusers--file/usr/local/mongodb/users.json--typejson

备份

命令作用
-hMongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d需要备份的数据库实例,例如:test
-o备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据
sudomongodump-h127.0.0.1:27017-ddbName-o/usr/local/mongodb/

恢复

命令作用
-hMongoDB所在服务器地址
-d需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--dir备份数据所在位置,例如:/home/mongodump/itcast/
--drop恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!
sudomongorestore-h127.0.0.1:27017-dtest--dir/usr/local/mongodb/dbName

可视化

参考文档

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions