数据库有关系型数据库(RDBMS),关系型数据库相对比较高端,也有很多种,但开源的我们一般都使用MySQL
或者PostgreSQL
。
MySQL
一般会使用比较流行的Felix Geisendorfer
的mysql
模块PostgreSQL
一般使用Brian Carlson
的node-postgres
模块
非关系型数据库在最近几年隐隐有复兴之势,他们称为NoSQL
数据库,即:Not Only SQL。可以这么说,关系型数据库为了可靠性牺牲了性能,而很多NoSQL
数据库把性能放在了第一位。两个非常流行的NoSQL
数据库,就是Redis
和MongoDB
。
Redis
一般使用Matt Ranney
的redis
模块MongoDB
最成熟最活跃的是Charistian Amor Kvalheim
的mongodb
模块
MongoDB的安装和资源
对于Windows
下的安装我觉得还是很烦的,这个平台对开发者真的不太友好呀。我觉得最好还是查看官方的安装教程: MongoDB Window平台安装,网上有很多安装教程,很多我都觉得是一知半解,就把教程搬上来,还是不太建议。
警报: Windows
平台使用CMD
,一定要以管理员身份运行,否则会有访问错误。
有时候我们可以利用services.msc
来查看windows
服务。若要开启MongoDB
服务器:
λ net start MongoDB
MongoDB 服务正在启动 .
MongoDB 服务已经启动成功。
若要停止服务器:
λ net stop MongoDB
MongoDB 服务正在停止.
MongoDB 服务已成功停止。
开启MongoDB
服务器之后,我们可以使用mongo
来启动MongoDB shell
:
λ mongo
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-06-09T16:57:57.010+0800 I CONTROL [initandlisten]
2017-06-09T16:57:57.010+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-06-09T16:57:57.010+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-06-09T16:57:57.010+0800 I CONTROL [initandlisten]
>
资源:
JavaScript Shell
MongoDB
命令行工具是一个基于JavaScript
的数据库操作和管理工具。
启动shell
首先要开启MongoDB
服务器,然后运行mongo
执行文件(mongo.exe
在安装目录的bin
文件夹下)。
在
Windows
系统下,你可以将mongo
加入系统环境变量。比如,我的安装目录是F:\Program Files\MongoDB\Server\3.4\bin
,所以将此目录加入系统环境变量的Path
变量中。
运行MongoDB Shell
λ mongo
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
Server has startup warnings:
2017-06-14T21:53:34.579+0800 I CONTROL [initandlisten]
2017-06-14T21:53:34.579+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-06-14T21:53:34.579+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-06-14T21:53:34.579+0800 I CONTROL [initandlisten]
创建数据库、集合和文档
创建数据库。
> use tutorial
switched to db tutorial
注意: 这个命令只是切换到tutorial
数据库而不需要显示创建它。只有在第一次插入数据库和集合时才会创建,这也符合MongoDB
动态操作数据的模式。
创建集合(collection)和文档。
> db.users.insert({username:"mao"})
WriteResult({ "nInserted" : 1 })
这里,users
就是一个集合,你可以使用show collections
命令来查看。同时,也可以使用show dbs
来查看所有的数据库。
> show collections
numbers
users
> show dbs
admin 0.000GB
local 0.000GB
tutorial 0.000GB
tutorial
是我们创建的数据库。admin
和local
是系统默认的。
插入和查询
db.users.insert({username:"mao"})
就将我的姓名插入了一个文档,如果插入成功,也成功保存了第一个文档。
查看这个文档:
> db.users.find()
{ "_id" : ObjectId("5941405661a0c8c10ed875ad"), "username" : "mao" }
有时候为了更好看的,可以使用
find().pretty()
_id
字段是文档的主键。ObjectId
是MongoDB
默认的,表示系统自己创建的。
在多个文档中,你可以向find()
传入参数来传递查询条件。
> db.users.insert({username:"timi"})
WriteResult({ "nInserted" : 1 })
> db.users.count()
2
> db.users.find()
{ "_id" : ObjectId("5941405661a0c8c10ed875ad"), "username" : "mao" }
{ "_id" : ObjectId("5941416961a0c8c10ed875ae"), "username" : "timi" }
> db.users.find({username:"timi"})
{ "_id" : ObjectId("5941416961a0c8c10ed875ae"), "username" : "timi" }
count()
函数可以计算集合中的文档数。
查询多个字段。
> db.users.find({username:"timi",_id:ObjectId("5941416961a0c8c10ed875ae")})
{ "_id" : ObjectId("5941416961a0c8c10ed875ae"), "username" : "timi" }
实际上,这段命令隐式创建了
AND
语句。和这条语句是等价的> db.users.find({$and: [{username:"timi"},{_id:ObjectId("5941416961a0c8c10ed875ae"})]})
如果要使用OR
查询文档,只需使用$or
替换。
更新文档
所有的更新操作至少需要2个参数。第一个指定要更新的文档,第二个定义如何修改此文档。
第一种,更新一个或多个文档
> db.users.update({username:"timi"},{$set:{country:"China"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : ObjectId("5941405661a0c8c10ed875ad"), "username" : "mao" }
{ "_id" : ObjectId("5941416961a0c8c10ed875ae"), "username" : "timi", "country" : "China" }
update
的第一个参数是查找一个用户名为timi
的文档,如何将country
属性设置为China
。使用$set
操作符。
如果不想要的字段,使用$unset
操作符删除即可。
第二种,直接替换文档
> db.users.update ({username:"timi"},{country:"Chia"})
WriteResult({"nMatched":1},"nUpserted":0,"nModified":1)
更新复杂数据
> db.users.update ({username:"timi"},
... {
... $set:{
... favorites:{
... cities:["Nanking", "NUAA"],
... movies:["For a Few dollars","The String"]}
... }
... })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
删除数据
- 清空集合中的所有文档
> db.users.remove()
- 删除某些文档
> db.users.remove ({country:"China"})
WriteResult({"nRemoved: 1"}
这个操作删除了所有country
为China
的文档。
- 删除结合及其附带的索引,使用
drop
方法
> db.users.drop()