MongoDB权威指南摘录(一):文档操作

1.创建局部变量post

 post={"title": "My Blog Post",
 "content": "Here is my blog post.",
 "date": new Date()}

这里写图片描述

2.将post插入当前数据库blog集合

db.blog.insert(post)

3.使用find方法查看

db.blog.find().pretty()

这里写图片描述

4.只查看集合中一个文档使用findOne方法

db.blog.findOne()

这里写图片描述

5.update接受(至少)两个参数:

第一个是要更新文档的限定条件
第二个是新的文档

任务:给之前文章增加评论内容

首先修改变量post,增加“comment”键:

 post.comments = []

然后执行update操作,用新的文档替换标题为“My Blog Post”的文章:

db.blog.update({title: "My Blog Post"}, post)

使用find进行查看:

db.blog.find().pretty()

这里写图片描述

6.remove用来从db中永久性删除文档。

不使用参数进行调用的情况下,它会删除一个集合内所有文档
它也可以接受一个文档以指定限定条件。
删除刚刚创建的文档:

db.blog.remove({"title": "My Blog Post"})

7.db.help()可查看数据库级别的命令的帮助。

集合的相关帮助可以通过db.集合名.help()来查看

8.db.version()可查看当前运行的MongoDB服务器的版本。

9.db.集合名

访问集合一般没有问题
当访问集合名与数据库类的属性重名时,使用getCollection()函数进行访问,如:

 db.getCollection("version")

插入并保存文档

10.对目标集使用insert方法插入一个文档

db.foo.insert({“bar” : “baz”}

删除文档

11.删除user集合中所有的文档(不会删除集合本身,原有的索引保留):

db.users.remove()

remove可接受一个查询文档作为可选参数。给定参数后,只有符合条件的文档才会被删除,

任务:删除mailing.list集合中所有”optout”为true的人:
db.mailing.list.remove( {“optout”: true} )

12.删除集合 db.集合名.drop()

速度更快,但没有任何限制条件,集合和索引都不见了。

更新文档

13.update

有两个参数,一个是查询文档,用来找出要更新的文档;
另一个是修改器文档,描述找到的文档做哪些修改。

文档替换

14.最好确保更新总是指定唯一文档

例如通过“_id”这样的键来匹配,否则可能会出现因集合中已有相同“_id”的文档导致出错。

使用修改器

15.例子:插入网站点击量统计文档

> db.analytics.insert(
... {
...  "url" :"www.example.com",
...  "pageviews" :52
... }
... )

这里写图片描述
每有人访问页面,就会通过url找到该页面。
使用“$inc”修改器增加“pageviews”的值:

> db.analytics.update({ "url" : "www.example.com"},
... {"$inc" : {"pageviews" : 1 }})

这里写图片描述
接着使用find操作,会发现“pageviews”增加了1。
这里写图片描述

16.使用修改器时“_id”的值不能改变。

整个文档替换时可以替换“_id”的值。其他键值,包括其他唯一索引的键,均可改变。

一、“$set”修改器入门

增加、修改或删除键时,应使用 修 改 器 。 “ set”用来指定一个键的值。如果键不存在,则创建它。
例如,插入一个用户的资料:

> db.user.insert({
... "name" : "joe",
... "age" : 30,
... "sex" : "male",
... "location" : "Wisconsin"
... }
... )

<code>这里写图片描述</code>
添加自己喜欢的书籍进去:

> db.user.update({"_id" :  ObjectId("5a7a5e5aa6757e91d745c718")},
... {"$set" : {"favoriite book" : "war and peace"}})

这里写图片描述
如果用户喜欢另一本书:

db.user.update({"_id" :  ObjectId("5a7a5e5aa6757e91d745c718")}, {"$set" : {"favoriite book" : "green eggs and ham"}})

这里写图片描述
$set还可以修改键的类型。例如,用户喜欢一堆书:

db.user.update({"_id" :  ObjectId("5a7a5e5aa6757e91d745c718")}, {"$set" : {"favoriite book" : ["cat's cradle","foundation trilogy","ender's game"]}})

这里写图片描述
可用$unset将键完全删除,例如用户发现自己不爱读书:

db.user.update({"_id" :  ObjectId("5a7a5e5aa6757e91d745c718")}, {"$unset" : {"favoriite book" : 1}})

这里写图片描述
也可以用$set**修改内嵌文档**:

db.blog.post.insert({
... "title" : "A Blog Post",
... "content" : "...",
... "author" :{
...     "name" : "joe",
...     "email" : "joe@example.com"
...   }
... })

这里写图片描述

二、增加和减少

$inc修改器用于增加已有键值,或者在键不存在时创建一个键。
例如建立一个游戏集合,游戏和分数变化都存储在里面

 db.games.insert({"game":"pinball", "user": "joe"})

每次游戏胜利积分加50:

db.games.update({"user" : "joe"},{"$inc" : {"score":50}})

这里写图片描述
每次游戏胜利积分加100:

db.games.update({"user" : "joe"},{"$inc" : {"score":100}})

$inc键的值必须为数字,不能用字符串、数组或其他非数字的值。

三、数组修改器

如果指定键已存在,$push会向已有数组末尾加入一个元素,没有则创建一个新的数组。
例如,向博客文章加入一个包含一个数组的“comment”键。

 db.blog.post.update({"title" : "A Blog Post"},{"$push":
... {"comments":{
...    "name" : "joe",
...    "email" : "joe@example.com",
...    "content" : "nice post."}
... }
... })

这里写图片描述
接着添加一条评论

 db.blog.post.update({"title" : "A Blog Post"},{"$push": {"comments":{    "name" : "bob",    "email" : "joe@example.com",    "content" : "nice post."} } })

这里写图片描述
$ne如果一个值不在数组中则把它添加入数组

db.papers.update({“authors cited” : {“$ne” : “Richie”}},
 {“$push : { “author cited” : “Richie”}})

使用$addToSet更好,避免重复的进行插入
addToSet a d d T o S e t 和 each组合起来,可以添加多个不同的值。

db.user.update({“_id”:^^^^^},
  {“$addToSet: {“emails” :{“$each:[
         “joe@php.net”,  "joe@python.org”]}}})

$pop可以从数组任一端删除元素,而不仅仅是依据位置。

  {“$pop” : {key :1}} //从数组尾部删除一个元素
   {“$pop”:{key:-1}} //从头部删除

这里写图片描述
db.blog.post.update({“title” : “A Blog Post”},{“$pop”: {“comments”:{key:1 }} })

$pull可以基于特定条件来删除元素(所有匹配的都删掉)。

> db.lists.insert({"todo" : ["dishes","laundry","dry cleaning"]})
> db.lists.update({ },{"$pull" : {"todo" : "laundry"}})

这里写图片描述

四、数组定位修改器

数组有多个值,只想对其中一部分操作:通过位置(数组下标)或定位操作符($)。
例如,增加第一个评论的投票数量,

db.blog.update( {“post” : post_id},
     {“$inc” : {“comments.0.votes” : 1}})

但很多时候需要查询来修改,可使用”$”来定位文档已经匹配的元素,并进行更新。

db.blog.update({“comments.author” : “John”},
{“$set” : {“comments.$.author” : “Jim”}})

定位符只更新匹配到的第一个元素。

Upsert

若没有文档符合更新条件,就会以条件和更新文档为基础创造一个新的文档。若找到匹配文档,则正常更新。
通过update第三个参数来执行upsert

db.math.update({"count" : 25}, {"$inc" : {"count" : 3 } }, true)

这里写图片描述
save可以在文档不存在时插入,存在时更新。

更新多个文档
默认情况下,update只能对符合情况的第一个文档执行操作。
使所有匹配到的文档都得到更新,设置update第四个参数为true

db.students.update({"CSRQ":19980106},
.. ... {"$set": {"gift" : "Happy Birthday!"}},false,true)

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值