MongoDB创建,更新,删除文档(上)
MongoDB创建,更新,删除文档(上)
创建文档
向MongoDB插入数据,使用insert,
如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})
这个操作会给 文档 增加 一个"_id",键,并保存在数据库中。
批量插入 www.zzzyk.com
如果要插入多个文档,使用批量插入会快一些,批量化插入能传入一个有文档构成的数据给数据库
一次批量插入只是单个的TCP请求,避免了许多零碎的请求带来的开销.由于无需处理大量的消息头,
这样能减少插入时间.每当单个文档发送致数据库时,会有一个头部信息,告诉数据库对指定的集合做
插入操作.用批量插入的话,数据库就不用重复的处理每个文档的这种头部信息了.
当前版本MongoDB消息的最大长度是16M,使用批量插入是有这个限制的.
插入的原理和作用
当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库.数据库解析
BSON,检验是否包含"_id"键并且不超过16M,除此之外,不做别的验证,就只是简单的将文档原样的
存入数据库.这样做的坏处是允许插入无效的数据,好处是能让数据库更加安全,远离注入式攻击.
所有的主流语言的驱动会在传送数据之前进行一些数据的有效性检查(文档是否超长,是否含非utf-8的字符,
是否使用了未知类型).同样也可以启动数据库服务器的时候使用--objcheck选项,这样服务器就会在插入
之前先检验文档结构的有效性,当然这样要牺牲性能.
查看doc文档转化为BSON的大小(以字节为单位),在shell中使用Object.bsonsize(doc)
www.zzzyk.com
删除文档
db.users.remove()
会删除users集合的所有文档,但不会删除集合本身,原有的索引也会保留.
remove函数可以接受一个查询文档作为可选参数,给定这个参数,只有符合条件的文档才会被删除.
db.users.remove({"name":"Refactor"})
删除数据的永久性的,不能撤销和恢复.
如果要清除整个集合,直接删除集合(然后重建索引)比删除集合中所有的文档要快.
删除集合:db.drop_collection("users")
更新文档
update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档进行那些更改
更新的操作是原子性的,若两个更新同时发生,先到服务器的先执行,然后执行另一个.最后的更新会显示在数据库
文档替换
更新最简单的就是使用一个新文档来替代匹配的文档,这适用于模式结构发生较大变化的时候.如将下面的文档
{
"name":"refactor",
"friends":20,
enemies:2
}
更改为
{ www.zzzyk.com
"name":"refactor",
"relationships":
{
"friends":20,
enemies:2
}
}
使用修改器
通常文档只会有一部分更新,利用原子的"更新修改器",更新修改器是特殊的键,用来指定复杂的更新操作,比如:
调整,增加,删除键,操作数组,操作内嵌文档.
一般网站都有计数器,来记数公有多少人访问,可以使用原子修改器原子性的完成整个功能.如:
"$set"修改器入门
"$set"用来指定一个键的值,如果键不存在,则创建,这对更新模式或者增加用户定义键来说很方便.
如:
db.users.insert(
{
"name":"refactor",
"age":23,
"易做图":"male"
}
)
添加喜欢的书籍:
db.users.update(
{
"name":"refactor"
}, www.zzzyk.com
{
"$set":{"book":"war and peace"}
}
)
db.users.findOne(
{"name":"refactor"}
)
修改喜欢的数据
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":"war and peace2"}
}
)
"$set"可以修改键的数据类型,如果喜欢多本书,
将book键的值变为一个数组
db.users.update(
{
"name":"refactor"
},
{
"$set":{"book":["war and peace","war and peace2"]}
}
)
使用"$unset"将键删除,没有要删除的键也不报错
db.users.update(
{
"name":"refactor"
},
{
"$unset":{"book":1}
}
)
使用"$set"修改内嵌文档
db.blog.insert(
{
"title":"refactor's blog",
"Content":"refactor's blog test",
"author":
{
"name":"refactor",
"email":"295240648@163.com"
}
} www.zzzyk.com
)
db.blog.update(
{
"author.name":"refactor"
},
{
"$set":{"author.name":"refactor2"}
}
)
db.blog.findOne(
{
"title":"refactor's blog"
}
)
增加,修改,删除键的时候,应该使用$修改器.一定要使用$开头的修改器来修改键值对.
使用"$inc" 增加和减少
"$inc"用来增加已有键的值,若不存在键,则增加.用于分析数据,因果关系,投票或其他有变化值的地方.
如:
db.users.insert(
{"url":"http://www.cnblogs.com/refactor"}
)
使用"$inc" 增加一个键pageViews,默认值为10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":10000}}
)
使用"$inc"给键pageViews,再增加10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":10000}}
)
使用"$inc"给键pageViews,再减少10000
db.users.update(
{"url":"http://www.cnblogs.com/refactor"},
{"$inc":{"pageViews":-10000}}
) www.zzzyk.com
"$inc"和"$set"用法相似,用来增加或减少数字."$inc"只能用于整数,长整数或双精度浮点数.
虽然很多语言能将 null,bool,有数字构成的字符串 转化成 数字,但使用"$inc"仍会报错:
"$inc"键的值也必须为数字.
数组修改器
"$push"和"$pop"只能用于数组.
如果指定的键已存在,"$push"会向已有的数组末尾加入一个元素,如果键不存在,就创建一个新数组.
如:
db.blog.insert(
{
"title":"refactor's blog",
"Content":"refactor's blog test",
"author":
{
"name":"refactor",
上一个:MongoDB创建,更新,删除文档(下)
下一个:数据库基础之“索引”
- 更多mongodb疑问解答:
- 【急】MongoDB写入错误~~~~
- Mongodb NOSql 数据库问题,是否可以插入带接口的类
- java操作mongodb
- Spring data MongoDB 更新整个内嵌文档时报错???????
- node.js连接mongodb更新
- MongoDB Java驱动 WriteConcern.SAFE非常浪费资源
- 求科普,hibernate怎样操作mongodb?
- 问一下mongodb怎么用hibernate整合
- mongodb查询的数据过多
- 使用JAVA创建MongoDB的问题
- Mongodb事务管理问题?
- mongodb利用java进行模糊查询
- spring 抽象类 注入值为空(spring3+mongodb+morphia)
- 【急】MongoDB写入错误~~~~
- Mongodb NOSql 数据库问题,是否可以插入带接口的类