你的浏览器不支持canvas

Love You Ten Thousand Years

Node和MongoDB数据库打交道

Date: Author: M/J

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自小可嗒嗒的博客

数据库有关系型数据库(RDBMS),关系型数据库相对比较高端,也有很多种,但开源的我们一般都使用MySQL或者PostgreSQL

  • MySQL一般会使用比较流行的Felix Geisendorfermysql模块
  • PostgreSQL一般使用Brian Carlsonnode-postgres模块

非关系型数据库在最近几年隐隐有复兴之势,他们称为NoSQL数据库,即:Not Only SQL。可以这么说,关系型数据库为了可靠性牺牲了性能,而很多NoSQL数据库把性能放在了第一位。两个非常流行的NoSQL数据库,就是RedisMongoDB

  • Redis一般使用Matt Ranneyredis模块
  • MongoDB最成熟最活跃的是Charistian Amor Kvalheimmongodb模块

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是我们创建的数据库。adminlocal是系统默认的。

插入和查询

db.users.insert({username:"mao"})就将我的姓名插入了一个文档,如果插入成功,也成功保存了第一个文档。

查看这个文档:

> db.users.find()
{ "_id" : ObjectId("5941405661a0c8c10ed875ad"), "username" : "mao" }

有时候为了更好看的,可以使用find().pretty()

_id字段是文档的主键。ObjectIdMongoDB默认的,表示系统自己创建的。

在多个文档中,你可以向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 })

删除数据

  1. 清空集合中的所有文档
> db.users.remove()
  1. 删除某些文档
> db.users.remove ({country:"China"})
WriteResult({"nRemoved: 1"}

这个操作删除了所有countryChina的文档。

  1. 删除结合及其附带的索引,使用drop方法
> db.users.drop()

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。