第三章 创建 更新和删除文档
1 插入并保存文档
> db.foo.insert({"bar":"baz"})
WriteResult({ "nInserted" : 1 })
> db.foo.find()
{ "_id" :ObjectId("586a5b4118af40bbf39030af"), "test" : 2 }
{ "_id" :ObjectId("586b13d6a0cb040ba53f2464"), "bar" :"baz" }
2 删除文档
> db.foo.remove()
#测试删除速度
示例代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/1/3 12:15 # @Author : Retacn # @Site : 测试删除速度 # @File : test_del.py # @Software: PyCharm __author__ = "retacn" __copyright__ = "property of mankind." __license__ = "CN" __version__ = "0.0.1" __maintainer__ = "retacn" __email__ = "zhenhuayue@sina.com" __status__ = "Development" from pymongo import MongoClient import time # 创建数据库联接 client = MongoClient() db = client.test_database collection = db.bar #print(collection) # 添加一佰万个虚拟元素 #for i in range(1000000): # collection.insert({"foo": "bar", "baz": i, "z": 10 - i}) # 删除并开始计时 start = time.time() collection.remove() collection.find_one() # 计算用时 total = time.time() - start print("%d seconds" % total)
运行结果如下:
37 seconds
也可以用其它方法删除
> show collections
Bar
#在python代码中可以使用db.drop_collection(“bar”)
> db.bar.drop()
true
> show collections
>
3 更新文档
#添加数据记录
>db.users.insert({"name":"retacn","friends":33,"enemies":2})
WriteResult({ "nInserted" : 1 })
#查询单条记录
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"name" : "retacn",
"friends" : 33,
"enemies" : 2
}
#定义人员变量
> varretacn=db.users.findOne({"name":"retacn"})
#查看变量值
> retacn
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"name" : "retacn",
"friends" : 33,
"enemies" : 2
}
#定义人员属性变量
>retacn.relationships={"friend":retacn.friends,"enemies":retacn.enemies}
{ "friend" : 33,"enemies" : 2 }
#设置人员属性值
> retacn.username=retacn.name
retacn
> delete retacn.friends
true
> delete retacn.enemies
true
> delete retacn.name
True
#更新人员信息到数据库
>db.users.update({"name":"retacn"},retacn)
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
#查询人员信息
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn"
}
使用修改器:
#查询人员信息
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn",
"age" : 32
}
#使用修改器修改人员信息
>db.users.update({"username":"retacn"},{"$inc":{"age":1}})
WriteResult({ "nMatched" : 1, "nUpserted": 0, "nModified" : 1 })
#查询人员信息
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn",
"age" : 33
}
使用$set修改器
#查询用户信息
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn",
"age" : 33
}
#更新用户信息
>db.users.update({"_id":ObjectId("586b40507dfc144b68de4071")},{"$set":{"sex":"male","loction":"ZiBo"}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
#查询更新后用户信息
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn",
"age" : 33,
"sex" : "male",
"loction" : "ZiBo"
}
删除属性键
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn",
"age" : 33,
"sex" : "male",
"loction" :"ZiBo"
}
#删除属性键值
>db.users.update({"username":"retacn"},{"$unset":{"loction":"ZiBo"}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"friend" : 33,
"enemies" : 2
},
"username" : "retacn",
"age" : 33,
"sex" : "male"
}
修改内嵌文档
>db.users.update({"username":"retacn"},{"$set":{"relationships.friend":32}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn",
"age" : 33,
"sex" : "male",
"location" : "ZiBo"
}
增加/减少,前面已测试,如果键不存在,会自动创建
数组修改器
#添加记录
>db.blog.posts.insert({"title":"A blogpost",content:"...","author":{"name":"retacn","email":"zhenhuayue@sina.com"}})
WriteResult({ "nInserted" : 1 })
#查看记录
> db.blog.posts.find()
{ "_id" :ObjectId("586f21115da1e3bac2c373fe"), "title" : "Ablog post", "content" : "...", "author" : {"name" : "retacn", "email" : "zhenhuayue@sina
.com" } }
> db.blog.posts.findOne()
{
"_id" :ObjectId("586f21115da1e3bac2c373fe"),
"title" : "A blog post",
"content" : "...",
"author" : {
"name" :"retacn",
"email" :"zhenhuayue@sina.com"
}
}
#更新记录
> db.blog.posts.update({"author.name":"retacnyue"},{$push:{"comments":{"name":"retacn","email":"zhenhuayue@sina.com","content":"nicepost"}}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
#查看更新后记录
> db.blog.posts.findOne()
{
"_id" : ObjectId("586f21115da1e3bac2c373fe"),
"title" : "A blog post",
"content" : "...",
"author" : {
"name" : "retacnyue",
"email" :"zhenhuayue@sina.com"
},
"comments" : [
{
"name" :"retacn",
"email" :"zhenhuayue@sina.com",
"content" :"nice post"
}
]
}
>
#重复添加,同上
#添加新地址时为了不重复,可以作如下操作
#添加邮件数组
>db.users.update({"username":"retacn yue"},{$push:{"emails":"zhenhuayue@sina.com"}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
#查询
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo",
"emails" : [
"zhenhuayue@sina.com"
]
}
#更新邮件数组
> db.users.update({"username":"retacnyue"},{"$addToSet":{"emails":"loveyou.for.ever@163.com"}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo",
"emails" : [
"zhenhuayue@sina.com",
"loveyou.for.ever@163.com"
]
}
添加多个不同的值,使用addToSet和each组合,示例代码如下:
#查询记录
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo"
}
#使用addToSet和each组合,添加多个不同的值
>db.users.update({"_id":ObjectId("586b40507dfc144b68de4071")},{"$addToSet":{"emails":{"$each":["zhenhuayue@163.com","zhenhuayue@yahoo.com"]}}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
#查看更新后内容
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo",
"emails" : [
"zhenhuayue@163.com",
"zhenhuayue@yahoo.com"
]
}
>
删除数组元素
#从数组未尾删除
>db.users.update({"_id":ObjectId("586b40507dfc144b68de4071")},{$pop:{"emails":1}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo",
"emails" : [
"zhenhuayue@163.com",
"zhenhuayue@yahoo.com",
"zhenhuayue@hotmail.com"
]
}
#从数组头部删除
>db.users.update({"_id":ObjectId("586b40507dfc144b68de4071")},{$pop:{"emails":-1}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo",
"emails" : [
"zhenhuayue@yahoo.com",
"zhenhuayue@hotmail.com"
]
}
删除特定条件元素,会将所有匹配的删除
>db.users.update({"_id":ObjectId("586b40507dfc144b68de4071")},{"$pull":{"emails":"zhenhuayue@yahoo.com"}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
"_id" : ObjectId("586b40507dfc144b68de4071"),
"relationships" : {
"enemies" : 2,
"friend" : 32
},
"username" : "retacn yue",
"age" : 33,
"sex" : "male",
"location" : "ZiBo",
"emails" : [
"zhenhuayue@hotmail.com"
]
}
数组的定位修改器
> db.blog.posts.findOne()
{
"_id" : ObjectId("586f21115da1e3bac2c373fe"),
"title" : "A blog post",
"content" : "...",
"author" : {
"name" : "retacnyue",
"email" :"zhenhuayue@sina.com"
},
"comments" : [
{
"name" :"yue",
"email" :"zhenhuayue@126.com",
"content" :"good",
"votes" : 10
},
{
"name" :"three",
"email" :"zhenhuayue@hotmail.com",
"content" :"better",
"votes" : 8
},
{
"name" :"zhenhua",
"email" :"zhenhuayue@qq.com",
"content" :"best",
"votes" : 11
}
]
}
#增加第一个评论的投票数
>db.blog.posts.update({"title":"A blogpost"},{"$inc":{"comments.0.votes":1}})
WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })
> db.blog.posts.findOne()
{
"_id" : ObjectId("586f21115da1e3bac2c373fe"),
"title" : "A blog post",
"content" : "...",
"author" : {
"name" : "retacnyue",
"email" :"zhenhuayue@sina.com"
},
"comments" : [
{
"name" :"yue",
"email" :"zhenhuayue@126.com",
"content" :"good",
"votes" : 11
},
{
"name" :"three",
"email" :"zhenhuayue@hotmail.com",
"content" :"better",
"votes" : 8
},
{
"name" :"zhenhua",
"email" :"zhenhuayue@qq.com",
"content" :"best",
"votes" : 11
}
]
}
>
修改器的速度,示例代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/1/6 17:48 # @Author : Retacn # @Site : 测试修改器速度 # @File : modifier.py # @Software: PyCharm __author__ = "retacn" __copyright__ = "property of mankind." __license__ = "CN" __version__ = "0.0.1" __maintainer__ = "retacn" __email__ = "zhenhuayue@sina.com" __status__ = "Development" from pymongo import MongoClient import time client=MongoClient() client.drop_database("updates") db=client.updates collection=db.foo #collection.insert({'x':1}) collection.insert({'u':1}) collection.find_one() print(collection.find_one()) start=time.time() for i in range(100000): #运行结果66.67881393432617 #collection.update({},{"x":1}) #运行结果660 collection.update({},{'$push':{'x':1}}) collection.find_one() print(time.time()-start) print(collection.find_one())
更新时开启upsert选项
如果没有文档符合条件,就会以这个条件和更新为基础创建一个新的文档
Db.users.update({“username”:”retacn”},{“$inc”:{“count”:1}},true)
Save是shell的一个函数,在文档不存在时插入,存在时更新
更新多个文档
将update的第四个参数设为true
返回已更新的文档
#表示每个进程状态的文档
{
“_id”:..
“status”:.. //READY RUNNING DOWN
“priority”:..
}
Ps=db.runCommond({“findAndModify”:”processes”,”query”:{“status”:”READY”},”sort”:{“priority”:-1},”update”:{“$set”:{“status”:”RUNNING”}}})
瞬间完成
安全操作
即是线程安全的
像java python ruby 中使用连接池,如果插入和查找不在同一个连接中,会不同步