创建数据库
use foobar
use foobar 也可也用于切换数据库;
show dbs 查看数据库
show dbs
admin 0.000GB
config 0.000GB
foobar 0.000GB
local 0.000GB
test 0.000GB
通过 show collections 可以查看到文档对象
> show collections
persion
db.collection.drop() 删除集合
db.hhw.drop()
true
Document 数据插入
1.插入文档
1.语法: db.[documentName].insert({})
比如:向persion 中插入了一条数据;
> db.persion.insert({name:"小明"})
WriteResult({ "nInserted" : 1 })
查看persion中的数据,2条
db.persion.find()
{ "_id" : ObjectId("5b6158db08e092bfa2d6abbd"), "name" : "小红" }
{ "_id" : ObjectId("5b6158e808e092bfa2d6abbe"), "name" : "小明" }
2.批量插入文档
shell 这样执行是错误的 db.[documentName].insert([{},{},{},……..])
shell 不支持批量插入
想完成批量插入可以用mongo的应用驱动或是shell的for循环
3.Save操作
save操作和insert操作区别在于当遇到_id相同的情况下
save完成保存操作
insert则会报错
Document 数据删除
1.删除列表中所有数据
db.[documentName].remove()
集合的本身和索引不会别删除
2.根据条件删除
db.[documentName].remove({})
删除集合persion中name等于"小明"的纪录
db.persion.remove({name:"小明"})
WriteResult({ "nRemoved" : 1 })
> db.persion.find()
{ "_id" : ObjectId("5b6158db08e092bfa2d6abbd"), "name" : "小红" }
db.text.remove({name:”uspcat”})
3.小技巧
如果你想清楚一个数据量十分庞大的集合
直接删除该集合并且重新建立索引的办法
比直接用remove的效率和高很多
Document数据更新
1.强硬的文档替换式更新操作
db.[documentName].update({查询器},{修改器})
db.persion.update({name:"小白"}, {age:25})
db.persion.find()
{ "_id" : ObjectId("5b6158db08e092bfa2d6abbd"), "name" : "小红" }
{ "_id" : ObjectId("5b615bd808e092bfa2d6abbf"), "name" : "小明" }
{ "_id" : ObjectId("5b615bf108e092bfa2d6abc0"), "age" : 25 } //age由20 ,变成了25了
强硬的更新会用新的文档代替老的文档
2.主键冲突的时候会报错并且停止更新操作
因为是强硬替换当替换的文档和已有文档ID冲突的时候
则系统会报错
3.insertOrUpdate操作
目的:查询器查出来数据就执行更新操作,查不出来就替换操作
做法:db.[documentName].update({查询器},{修改器},true)
db.persion.update({name:"小红“},{name:"乔峰"},true)
查看数据
db.persion.find()
{ "_id" : ObjectId("5b6158db08e092bfa2d6abbd"), "name" : "乔峰" }
{ "_id" : ObjectId("5b615bd808e092bfa2d6abbf"), "name" : "小明" }
{ "_id" : ObjectId("5b615bf108e092bfa2d6abc0"), "age" : 25 }
如果数据不存在
db.persion.update({name:"红红"},{name:"乔峰"},true)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5b615df41e7efa65d6a24a94")
})
查看数据,多一条数据
> db.persion.find()
{ "_id" : ObjectId("5b6158db08e092bfa2d6abbd"), "name" : "乔峰" }
{ "_id" : ObjectId("5b615bd808e092bfa2d6abbf"), "name" : "小明" }
{ "_id" : ObjectId("5b615bf108e092bfa2d6abc0"), "age" : 25 }
{ "_id" : ObjectId("5b615df41e7efa65d6a24a94"), "name" : "乔峰" }
>
4.批量更新操作
默认情况当查询器查询出多条数据的时候默认就修改第一条数据
如何实现批量修改, 不做演示了,应该没有什么问题
db.[documentName].update({查询器},{修改器},false, true)
5.使用修改器来修改(很重要,很方便)
对文档对象的某个属性进行修改
修改器名称 |
语法 |
案例 |
$set |
{$set:{field: value}} |
{$set:{name:”uspcat”}} |
它用来指定一个键值对,如果存在键就进行修改不存在则进行添加. |
||
$inc |
{ $inc : { field : value } } |
{ $inc : { "count" : 1 } } |
只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作.增加1 db.persion.update({name:"小明"},{$inc:{age:30}},true),给name:"小明"的数据 ,年龄增加30; 查询出来结果为age:60 |
||
$unset |
{ $unset : { field : 1} } |
{ $unset : { “name":1 } |
他的用法很简单,就是删除指定的键 |
||
$push |
{ $push : { field : value } } |
{ $push : { books:”JS”} |
1.如果指定的键是数组增追加新的数值 2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array 3.如果不存在指定的键则创建数组类型的键值对 |
||
$pushAll |
{ $pushAll : { field : array } } |
{ $push : { books:[“EXTJS”,”JS”]} |
用法和$push相似他可以体谅添加数组数据 > db.persion.update({name:"小明"},{$push:{address:"张家口桥西区"}}) |
||
$addToSet |
{ $addToSet: { field : value } } |
{ $addToSet: { books:”JS”} |
目标数组存在此项则不操作,不存在此项则加进去 > db.persion.update({name:"小明"},{$addToSet:{address:"张家口桥东区"}}) |
修改器名称 |
语法 |
案例 |
$pop |
{$pop:{field: value}} |
{$pop:{name:1}} {$pop:{name:-1}} |
从指定数组删除一个值1删除最后一个数值,-1删除第一个数值 db.persion.update({name:"小明"},{$pop:{address:1}}) |
||
$pull |
{ $pull: { field : value } } |
{ $pull : { “book" : “JS” } } |
删除一个被指定的数值 db.persion.update({name:"小明"},{$pull:{address:"北京三里屯"}}) |
||
$pullAll |
{ $pullAll: { field : array} } |
{ $pullAll: { “name":[“JS”,”JAVA”]} |
一次性删除多个指定的数值 db.persion.update({name:"小明"},{$pullAll:{address:["北京昌平","北京海底"]}}) |
||
$ |
{ $push : { field : value } } |
{ $push : { books:”JS”} |
1.数组定位器,如果数组有多个数值我们只想对其中一部分进行操作我们就要用到定位器($) 例子: 例如有文档{name:”YFC”,age:27,books:[{type:’JS’,name:”EXTJS4”},{type:”JS”,name:”JQUERY”},{type:”DB”,name:”MONGODB”}]} 我们要把type等于JS的文档增加一个相同的作者author是USPCAT 办法: db.persion.update({"books.type":"JS"},{$set:{"books.$.author":"USPCAT"}}) |
*切记修改器是放到最外面,后面要学的查询器是放到内层的
给小明增加了age属性
db.persion.update({name:"小明"},{$set:{age:"30"}},true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persion.find()
{ "_id" : ObjectId("5b6158db08e092bfa2d6abbd"), "name" : "乔峰" }
{ "_id" : ObjectId("5b615bd808e092bfa2d6abbf"), "name" : "小明", "age" : "30" }
{ "_id" : ObjectId("5b615bf108e092bfa2d6abc0"), "age" : 25 }
{ "_id" : ObjectId("5b615df41e7efa65d6a24a94"), "name" : "乔峰" }
{ "_id" : ObjectId("5b615e991e7efa65d6a24a9c"), "name" : "红红", "age" : "30" }
6.$addToSet与$each结合完成批量数组更新
db.text.update({_id:1000},{$addToSet:{books:{$each:[“JS”,”DB”]}}})
$each会循环后面的数组把每一个数值进行$addToSet操作
db.persion.update({name:"小明"},{$addToSet:{address:{$each:["北京昌平","北京海淀","三里屯"]}}})
7.存在分配与查询效率
当document被创建的时候DB为其分配没存和预留内存当修改操作
不超过预留内层的时候则速度非常快反而超过了就要分配新的内存
则会消耗时间
8. runCommand函数和findAndModify函数
runCommand可以执行mongoDB中的特殊函数
findAndModify就是特殊函数之一他的用于是返回update或remove后的文档
runCommand({“findAndModify”:”processes”,
query:{查询器},
sort{排序},
new:true
update:{更新器},
remove:true
}).value
db.runCommand(
{"findAndModify":"persion",
"query":{name:"红红"},
"update":{$set:{age:60}},
"new":true}) //new true 表示更新后的文档,false表示更新前的文档
返回:
{
"lastErrorObject" : {
"n" : 1,
"updatedExisting" : true
},
"value" : {
"_id" : ObjectId("5b615e991e7efa65d6a24a9c"),
"name" : "红红",
"age" : 60
},
"ok" : 1
}
查看:db.persion.find()
{ "_id" : ObjectId("5b615e991e7efa65d6a24a9c"), "name" : "红红", "age" : 60 }
ps = db.runCommand({
"findAndModify":"persons",
"query":{"name":"text"},
"update":{"$set":{"email":"1221"}},
"new":true
}).value
do_something(ps)
参考网址:http://www.cppblog.com/byc/archive/2011/07/15/151063.aspx
mongodb-findAndModify(来源于mongodb权威指南)http://www.mongodb.org/display/DOCS/findAndModify+CommandfindAndModify Command findAndModify的调用方式和普通的更新略有不同,还有点慢,这是因为它要等待数据库的响应。这对于操作查询以及执行其他需要取值和赋值风格的原子性操作来说是十分方便的。 findAndModify命令中每个键对应的值如下所示。 findAndModify 字符窜,集合名。 query 查询文档,用来检索文档的条件。 sort 排序结果的条件。 update 修改器文档,对所找到的文档执行的更新。 remove 布尔类型,表示是否删除文档。 new 布尔类型,表示返回的是更新前的文档还是更新后的文档。默认是更新前的文档。 "update"和"remove"必须有一个,也只能有一个。要是匹配不到文档,这个命令会返回一个错误。 这个命令有些限制。它一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。 相比普通更新来说,findAndModify速度要慢一些。大概耗时相当于一次查找,一次更新和一次getLastError顺序执行所需的时间。 db.runCommand("findAndModify":集合名,"query":{查询条件},"upadte":{修改器}) |
使用db.help()方法可以获取db的一些信息
db.help()