当前位置:坤哥网-kungge-MongoDB学习笔记(二):增删改查

MongoDB学习笔记(二):增删改查

2017/11/15 23:31:40 坤哥网阅读(1059) 评论(0)


今天在Evernote中发现了这篇文章没有发布出来,于是花点时间整理发布下。

前面介绍了MongoDB的安装配置,这里介绍数据库的增删改查。


MongoDB连接


MongoDB默认不需要输入用户名和密码。新版已经不支持addUser创建用户,改成了createUser.
命令:db.createUser({user:'kungge',pwd:'kungge',roles:['userAdminAnyDatabase']})
260a8ee5-27b2-4cdd-9bec-291e18f6ab5a.png
查看当前DB的用户:
22418891-02f0-4252-92a1-72676dad01ba.png
使用kungge连接test数据库,格式: mongodb://username:pwd@localhost/dbname,其中用户名为kungge,密码也为kungge:

219c10b4-8aef-4b98-8a4e-da37248b311c.png


MongoDB创建数据库


使用命令:use DBName,若数据库不存在则创建数据库,否则切换到指定数据库。
使用db查看当前数据库:
353ba4b7-f8b2-4e14-9280-c1fe6edb8eea.png
用use,创建了名为kvandb的数据库:

e1e37f6f-d437-4a8e-bd0d-45a02ef74078.png


MongoDB删除数据库


删除命令:db.dropDatabase()。
本次删除数据库kvandb,先用show dbs命令查看所有数据库,然后命令use kvandb切换到该数据库,使用命令db.dropDatabase()删除,
再次用show dbs查看发现kvandb已经被删除。

736afa59-12d6-4d27-a06b-b31dfa44025c.png


MongoDB插入文档


MongoDB中的文档数据结构是BSON格式,类似于JSON。
使用insert()或者save()方法向集合中插入文档,语法格式:db.collection_name.insert(document),collection_name是你的文档集合名,类似于关系型数据库中的表名。
先创建一个数据库用于测试,如下创建ksitedb:
03e6a812-9859-40d8-ad23-2513aeb99b46.png
f9984825-a75c-4b06-a5cc-1681c9aff8aa.png
创建一个集合名为col的集合并向其中插入一条数据,插入完成之后用命令db.col.find()查看数据:
f625d131-b2c9-4fbe-9bcf-61f78267b32e.png
59ff8640-1b5b-4a44-88af-2b8ba5c18bd9.png
还可以将数据定义为一个变量,如doucument,执行完后,会格式化显示你要插入的数据,在使用db.col.insert(document)插入:
ac48429d-281a-4348-8a50-95645fc50939.png

还可以使用命令db.col.save(document)插入,若_id不指定则类似于insert(),若指定则更新该_id的数据。


MongoDB更新文档


更新集合中的文档有两种方法update()和save(),功能不同。


1.update()
update()用于更新已存在的文档,语法格式如下:
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
参数说明:
  • query为查询条件。

  •  updae为更新体。

  •  upsert可选,表示如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  •  multi可选,默认false,表示只更新符合条件的第一条记录,若为true则更新所有符合条件的记录。

  •  writeConcern可选,表示抛出异常的级别。

先查询出数据,再通过update()更新,将标题"MongoDB 基础学习"改成"MongoDB 基础":
f606ee99-b096-46c0-8c5d-91dc5f0eca71.png
2.save()
save()表示将传入的文档替换已存在的文档,语法如下:
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
参数说明:
  • document表示文档数据。

  • writeConcern(可选 ),表示抛出异常的级别。

如下将_id为"5829..."的文档替换,命令执行后查看数据已成功替换:
8fd84b91-612c-47f2-9d85-6229370ed765.png


MongoDB删除文档


删除文档使用remove()方法,语法如下:
db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)
参数说明:
  • query(可选)表示删除条件。

  • justOne(可选)表示是否只删除一个文档。

  • writeConcern(可选)表示抛出异常级别。

如下删除title为"MongoDB 基础"的数据:

95212821-d7ed-4a06-a455-5d215110060f.png


MongoDB查询文档


查询使用命令db.collectionName.find(),用来显示所有的文档,若要让结果格式化易读,可使用db.collectionName.find().pretty():

45959c77-69c8-4e2c-8eb4-3433be0cf07e.png


使用where条件


条件操作符如下:
条件格式实例在RDBMS中
等于{<key>:<value>}db.col.find({"createuser":"坤哥网"}).pretty()where createuser='坤哥网'
不等于{<key>:{$ne:<value>}}db.col.find({"views":{$ne:2016}}).pretty()where views<>2016
大于{<key>:{$gt:<value>}}db.col.find({"views ":{$gt:1000}}).pretty()where views>1000
大于或等于{<key>:{$gte:<value>}}db.col.find({"views ":{$gte:1000}}).pretty()where views>=1000
小于{<key>:{$lt:<value>}}db.col.find({"views ":{$lt:1000}}).pretty()where views<1000
小于或等于{<key>:{$lte:<value>}}db.col.find({"views ":{$lte:1000}}).pretty()where views<=1000
1.and条件
加上and查询,表示 where createuser='坤哥网' and views>2000:
6cd2fd7d-75f9-4c9c-b968-0b1353f4b8b7.png
2.or条件
加上or查询,表示 where createuser='kungge' or title='MongoDB 学习':
5e73133f-9a06-4bc8-9839-d5acddc7e38a.png
3.and和or联合查询
加上and和or联合查询,表示 where views>1000 and (createuser='kungge' or title='MongoDB 更新文档'):
35072e3f-e9ff-4e01-b3b2-54f5634408c1.png
limit和skip方法
limit和skip可以实现读取指定数量的数据。
1.limit()方法
语法格式:db.collectionName.find().limit(num),接受一个数字参数,表示指定从集合中查询的记录条数。
先查询所有,方便查看效果:
9d0d7715-9b36-4455-87b9-abb1010a3fb2.png
034c19df-8a30-4bef-9161-56d8aa959069.png
2.skip()方法
语法格式:db.collectionName.find().limit(num).skip(num),接受一个数字参数,表示指定跳过的记录条数:

ea2d1a16-b407-4249-a52e-ade01c085b75.png


排序


使用sort()方法实现排序,可指通过参数可指定排序的字段,使用1和-1指定排序方式,1表示升序,-1表示降序,若未指定排序方式则按升序。
语法格式:db.collectionName.find().sort({key:1})。
先查询所有:
3d4dabb8-74ba-486a-b4ab-df380d58f226.png
按views升序:
445a2519-a93b-4e3d-9bc0-2e50d1431e56.png
按views降序:

b2a787f6-f40f-46dc-96a5-c63de21a52bd.png


索引


使用索引可以大大提高查询效率,若是没有索引,MongoDB读取数据时必须扫描集合中的每个文件并选取满足查询条件的记录。
扫描全集合效率非常低,特别是大数据量时,对网站性能非常致命。
索引是特殊的数据结构,其存储于一个易于遍历读取的集合中,索引是对数据库表中一列或多列值进行排序的一种结构。
MongoDB使用ensureIndex()方法创建索引。
语法格式:db.collectionName.ensureIndex({key:1})。key表示索引字段,1表示按升序创建索引,-1为降序。
ensureIndex()可选参数如下表:
参数类型描述
backgroundboolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,为可选参数,background"默认值为false。
unique
boolean建立的索引是否唯一,true创建唯一索引,默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsboolean在建立唯一索引时是否删除重复记录,true 创建唯一索引,默认值为 false。
sparseboolean对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档,默认值为 false。
expireAfterSeconds
integer指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号,默认的索引版本取决于mongod创建索引时运行的版本。
weights
document索引权重值,数值在 1 到 99999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表,默认为英语。
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language。
ensureIndex()方法可以设置多个字段创建索引,这在关系型数据库中称为复合索引:
7606d554-8841-4807-881c-6f5c76defe80.png


聚合


聚合主要用于处理数据,如求和、求平均值等,并返回计算后的结果。
使用aggregate()方法。
语法格式:db.collectionName.aggregate(aggregateOperation)。
聚合表达式如下表:
表达式描述例子
$sum计算总和db.col.aggregate([{$group : {_id : "$createuser", num_tutorial : {$sum : "$views"}}}])
$avg计算平均值db.col.aggregate([{$group : {_id : "$createuser", num_tutorial : {$avg : "$views"}}}])
$min获取集合中所有文档对应值得最小值db.col.aggregate([{$group : {_id : "$createuser", num_tutorial : {$min : "$views"}}}])
$max获取集合中所有文档对应值得最大值db.col.aggregate([{$group : {_id : "$createuser", num_tutorial : {$max : "$views"}}}])
$first根据资源文档的排序获取第一个文档数据b.col.aggregate([{$group : {_id : "$createuser", num_tutorial : {$first: "$views"}}}])
$last根据资源文档的排序获取最后一个文档数据b.col.aggregate([{$group : {_id : "$createuser", num_tutorial : {$last: "$views"}}}])
根据createuser分组求总阅读量:
54a7a9e6-26a3-4009-b2e8-8790d783aee3.png
根据createuser分组求对应的记录数:
8abed5da-c897-4368-8436-5dc1b5d9b016.png
根据createuser分组分别求平均值、最小值、最大值:
76d26aa8-8504-42ef-af6c-af7deb1bf048.png
根据createuser分组排序获取第一个文档:
aa0b675d-70fe-451f-9fbc-d230be42723c.png


分类: NoSQL

有话要说? =>【不用注册,直接登录】,然后刷新本页面来发表您的观点(●'◡'●)