Mongodb的基本操作

0.写在前面

近年来后端nodejs+MongoDB的搭配好像比世界上最好的语言PHP+MySQL要火得多。虽然我node不怎么行,但是MongoDB还是要学一下的,PHP也能搭MongoDB。不过MySQL 5.7新特性终于支持json了,好像也还行,多一种选择。

1.NoSQL

NoSQL,泛指”非关系型数据库”。我们经常会用到”key-value”、文档的形式来储存数据,前者代表Redis,后者我想就是MongoDB了。

当然NoSQL储存的数据结构都比较简单,彼此间没有硬性关联,灵活性比较强。

MongoDB的collection相当于SQL的table,field相当于column,_id为主键,同样也能建立index(索引)。

2.MongoDB基本用法

创建和删除数据库

1
2
use dbName // 如不存在此数据库则直接创建
db.dropDatabase() // 用use切换到该数据库后才能删除

增删查改

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

insert

1
db.COLLECTION_NAME.insert(document)

document需为json格式。

remove

1
2
3
4
5
6
7
db.COLLECTION_NAME.remove(
<query>, // 可选 条件
{
justOne: <boolean>, // 可选 为true时只删除一个文档
writeConcern: <document> // 可选 抛出异常的级别
}
)

find

语句很简单

1
db.COLLECTION_NAME.find()

and条件查询直接在小括号加json查询条件{key1: value1}, {key2:value2}。

需要注意的是or条件查询,是这样的:

1
2
3
4
5
6
7
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)

条件操作符

是dollar+英文缩写

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte
1
db.COLLECTION_NAME.find({"A":{$gt : 123}})

我找到了缩写说明…

$gt ——– greater than >

$gte ——— gt equal >=

$lt ——– less than <

$lte ——— lt equal <=

$ne ———– not equal !=

$eq ——– equal =

排序

查找排序

1
db.COLLECTION_NAME.find().sort({KEY:1}) // 1升序,-1降序

limit和skip

可以用来做分页功能,跟MySQL差不多

1
2
db.COLLECTION_NAME.find().limit(NUMBER)
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

update

1
2
3
4
5
6
7
8
9
db.COLLECTION_NAME.update(
<query>, // 条件
<update>, // 通常是{$set:{key:value...}} 相当于SQL的set
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。

3.2新特性

db.collection.updateOne() 向指定集合更新单个文档

db.collection.updateMany() 向指定集合更新多个文档

save

save和update不同,会直接替换全部数据

1
2
3
4
5
6
db.collection.save(
<document>, // 数据
{
writeConcern: <document>
}
)

备份与恢复

语法也跟MySQL差不多,不指定数据库的话会直接备份全部。

1
2
mongodump -h dbhost -d dbname -o dbdirectory // 备份
mongorestore -h <hostname><:port> -d dbname <path> // 恢复

最基本的用法就是上面这些啦,Nodejs有个扩展Mongoose,效率比较高,相比Nodejs-mongodb扩展不用频繁open和close连接

参考文档:菜鸟教程-MongoDB