为了方便查阅,这里将MongoDB常用命令进行了整理。
目录
1、新建collection db.createCollection("user")
3、重命名collection db.hello.renameCollection("HELLO")
4、创建索引在HELLO集合上,建立对Name字段的索引,1代表正序
runCommand 函数和 findAndModify 函数
一、数据库级操作
1、 查看数据库 show dbs
2、使用指定库 use dukun
> use dukun
switched to db dukun
3、查看所有数据集
> show collections
bruteforces
entries
sessions
settings
uplfiles
uplfolders
users
4、创建数据库
使用use
可以直接创建数据库,不过直到插入数据时,使用 show dbs
才能看到库
> use test
switched to db test
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
wiki 0.001GB
> db.hello.insert({"name":"mongodb"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
wiki 0.001GB
查看当前使用的库
> db
test
删除数据库
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> db
test
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
wiki 0.001GB
二、Collection级操作
collection 相当于数据库中的表
1、新建collection db.createCollection("user")
> db.createCollection("user")
{ "ok" : 1 }
> show collections
hello
user
效果与使用 db.user.insert({"user":"xxx"})
类似。
2、删除collection db.user.drop()
> db.user.drop()
true
> show collections
hello
> db.user.drop() ### 再删除已经不存在
false
3、重命名collection db.hello.renameCollection("HELLO")
> show collections
hello
> db.hello.renameCollection("HELLO")
{ "ok" : 1 }
> show collections
HELLO
4、创建索引在HELLO集合上,建立对Name字段的索引,1代表正序
> db.HELLO.ensureIndex({NAME:1})
三、Record级的操作
使用实现存在的test数据库做测试,其中有个Collection:user
1、插入数据
向user插入数据
> db.user.insert({'name':'Gal Gadot','gender':'female','age':28,'salary':11000})
> db.user.insert({'name':'Mikie Hara','gender':'female','age':26,'salary':7000})
也可以使用save
插入
> db.user.save({'name':'Wentworth Earl Miller','gender':'male','age':41,'salary':33000})
查找记录
1、查看集合所有记录 find()
> db.user.find()
{ "_id" : ObjectId("5d8985552eba8f32e136f0cc"), "name" : "dukun", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5d8985602eba8f32e136f0cd"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5d89856b2eba8f32e136f0ce"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
{ "_id" : ObjectId("5d89857b2eba8f32e136f0cf"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }
>
2、随机查看一条记录 findone()
> db.user.findOne()
{
"_id" : ObjectId("5d8985552eba8f32e136f0cc"),
"name" : "dukun",
"gender" : "female",
"age" : 28,
"salary" : 11000
}
3、查找符合记录的记录
- Exact Equal db.user.find({"age":28})
> db.user.find({"age":28})
{ "_id" : ObjectId("5d8985552eba8f32e136f0cc"), "name" : "dukun", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5d8985602eba8f32e136f0cd"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
4高级查询详解
db.t_member.find({},{_id:0,name:1})
第一个空括号表示查询全部数据,第二个括号中值为 0 表示不返回,值为 1 表示返回,默认情况下若不 指定主键,主键总是会被返回;
> db.user.find({},{_id:0,name:1})
{ "name" : "dukun" }
{ "name" : "Gal Gadot" }
{ "name" : "Mikie Hara" }
{ "name" : "Wentworth Earl Miller" }
db.persons.find({条件},{指定键});
- 比较操作符:$lt: < $lte: <= $gt: > $gte: >= $ne: !=
#查询年龄大于等于 26 小于等于 28 的人 ,且只显示name和age
db.t_member.find({age:{$gte:26,$lte:28}},{_id:0,name:1,age:1})
{ "name" : "dukun", "age" : 28 }
{ "name" : "Gal Gadot", "age" : 28 }
{ "name" : "Mikie Hara", "age" : 26 }
{ "name" : "bwukl", "age" : 27 }
>
- 包含与不包含 $in 或 $nin
> db.user.find({"city":{$in:["beijing","nanjing"]}})
{ "_id" : ObjectId("5d8afc70a1532b629d5f4919"), "name" : "bwukl", "age" : 27, "aihao" : [ "daqiu", "tiaowu" ], "city" : "nanjing" }
{ "_id" : ObjectId("5d8afc87a1532b629d5f491a"), "name" : "taos", "age" : 37, "aihao" : [ "meinv", "tiaowu" ], "city" : "nanjing" }
{ "_id" : ObjectId("5d8afcbba1532b629d5f491b"), "name" : "tassss", "age" : 37, "aihao" : [ "meinv", "lvyou" ], "city" : "beijing" }
- $or 查询
#查询语文成绩大于 85 或者英语大于 90 的学生信息
db.t_member.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1})
- 正则表达式 /查询项/
#查询名字中用ta的
> db.user.find({"name":/ta/})
{ "_id" : ObjectId("5d8afc87a1532b629d5f491a"), "name" : "taos", "age" : 37, "aihao" : [ "meinv", "tiaowu" ], "city" : "nanjing" }
{ "_id" : ObjectId("5d8afcbba1532b629d5f491b"), "name" : "tassss", "age" : 37, "aihao" : [ "meinv", "lvyou" ], "city" : "beijing" }
- $not 的使用
#查询出名字不包含k的
> db.user.find({"name":{$not:/k/}})
{ "_id" : ObjectId("5d8985602eba8f32e136f0cd"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5d89857b2eba8f32e136f0cf"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }
{ "_id" : ObjectId("5d8adf40a1532b629d5f4916"), "name" : "bajie", "age" : 19 }
{ "_id" : ObjectId("5d8afc87a1532b629d5f491a"), "name" : "taos", "age" : 37, "aihao" : [ "meinv", "tiaowu" ], "city" : "nanjing" }
{ "_id" : ObjectId("5d8afcbba1532b629d5f491b"), "name" : "tassss", "age" : 37, "aihao" : [ "meinv", "lvyou" ], "city" : "beijing" }
- 查询name以W打头的数据
> db.user.find({name:/^W/})
{ "_id" : ObjectId("5ce4f4dc3e7e1703c34ec0d3"), "name" : "Wentworth Earl Miller", "gender" : "male","age" : 41, "salary" : 33000 }
- 多条件“与”
查询age小于30,salary大于6000的数据
> db.user.find({age:{$lt:30},salary:{$gt:6000}})
{ "_id" : ObjectId("5ce4f4c33e7e1703c34ec0d1"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5ce4f4d03e7e1703c34ec0d2"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
- 多条件“或”
查询age小于25,或者salary大于10000的记录
> db.user.find({$or:[{salary:{$gt:10000}},{age:{$lt:25}}]})
{ "_id" : ObjectId("5ce4f4c33e7e1703c34ec0d1"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5ce4f4dc3e7e1703c34ec0d3"), "name" : "Wentworth Earl Miller", "gender" : "male","age" : 41, "salary" : 33000 }
- 查询指定字段的数据,并去重
> db.user.distinct('gender')
[ "female", "male" ]
- 指定结果集返回条目
> db.user.find().limit(2)
{ "_id" : ObjectId("5ce4f4c33e7e1703c34ec0d1"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5ce4f4d03e7e1703c34ec0d2"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
- 查询第一条以外的数据
> db.user.find().skip(1)
{ "_id" : ObjectId("5ce4f4d03e7e1703c34ec0d2"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
{ "_id" : ObjectId("5ce4f4dc3e7e1703c34ec0d3"), "name" : "Wentworth Earl Miller", "gender" : "male","age" : 41, "salary" : 33000 }
- 对结果集排序 sort 排序 1 为正序,-1 为倒序
升序
> db.user.find().sort({salary:1})
{ "_id" : ObjectId("5ce4f4d03e7e1703c34ec0d2"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
{ "_id" : ObjectId("5ce4f4c33e7e1703c34ec0d1"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5ce4f4dc3e7e1703c34ec0d3"), "name" : "Wentworth Earl Miller", "gender" : "male","age" : 41, "salary" : 33000 }
降序
> db.user.find().sort({salary:-1})
{ "_id" : ObjectId("5ce4f4dc3e7e1703c34ec0d3"), "name" : "Wentworth Earl Miller", "gender" : "male","age" : 41, "salary" : 33000 }
{ "_id" : ObjectId("5ce4f4c33e7e1703c34ec0d1"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("5ce4f4d03e7e1703c34ec0d2"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
- 统计结果集中的记录数量
> db.user.find().count()
删除操作
删除整个集合中的所有数据
> db.test.remove()
删除集合中符合过滤条件的数据
> db.test.remove({name:/aws/})
删除符合条件的一条记录
> db.test.remove({name:/aws/},1)
更新操作
db.collection.update(criteria, objNew, upsert, multi )
criteria
:update的查询条件,类似sql update查询内where后面的objNew
:update的对象和一些更新的操作符(如)等,也可以理解为sql update查询内set后面的。upsert
: 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi
: mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
> db.user.find()
{ "_id" : ObjectId("52453cfb25e437dfea8fd4f4"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }
{ "_id" : ObjectId("52453d8525e437dfea8fd4f5"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
{ "_id" : ObjectId("52453e2125e437dfea8fd4f6"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }
## 更新符合过滤条件的信息
> db.user.update({name:'Gal Gadot'},{$set:{age:23}},false,true)
> db.user.find()
{ "_id" : ObjectId("52453cfb25e437dfea8fd4f4"), "name" : "Gal Gadot", "gender" : "female", "age" : 23, "salary" : 11000 }
{ "_id" : ObjectId("52453d8525e437dfea8fd4f5"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }
{ "_id" : ObjectId("52453e2125e437dfea8fd4f6"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }
## 添加新的字段
> db.user.update({name:'Mikie Hara'},{$set:{interest:"CBA"}},false,true)
> db.user.find()
{ "_id" : ObjectId("52453cfb25e437dfea8fd4f4"), "name" : "Gal Gadot", "gender" : "female", "age" : 23, "salary" : 11000 }
{ "_id" : ObjectId("52453d8525e437dfea8fd4f5"), "name" : "Mikie Hara", "gender" : "female","interest" : "CBA", "age" : 26, "salary" : 7000 }
{ "_id" : ObjectId("52453e2125e437dfea8fd4f6"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }
## 使用函数 $inc 只能对数字使用
> db.user.update({gender:'female'},{$inc:{salary:50}},false,true)
> db.user.find()
{ "_id" : ObjectId("52453cfb25e437dfea8fd4f4"), "name" : "Gal Gadot", "gender" : "female", "age" : 23, "salary" : 11050 }
{ "_id" : ObjectId("52453d8525e437dfea8fd4f5"), "name" : "Mikie Hara", "gender" : "female","interest" : "CBA", "age" : 26, "salary" : 7050 }
{ "_id" : ObjectId("52453e2125e437dfea8fd4f6"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }
##$unset : 删除指定的键 删除gender
> db.user.update({"name":"dukun"},{$unset:{"gender":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
数组操作
- $push :
数组键操作:1、如果存在指定的数组,则为其添加值;2、如果不存在指定的数组,则 创建数组键,并添加值;3、如果指定的键不为数组类型,则报错;
> db.user.update({"name":"dukun"},{$push:{"class":["CN","JAVA"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find({"name":"dukun"})
{ "_id" : ObjectId("5d8985552eba8f32e136f0cc"), "name" : "dukun", "age" : 18, "salary" : 11000, "class" : [ [ "CN", "JAVA" ] ] }
- $addToSet : 当指定的数组中有这个值时,不插入,反之插入
#则不会添加到数组里
db.t_member.update({name:"zhangsan"},{$addToSet:{classes:"English"}}) ;
- $pop:删除指定数组的值,当 value=1 删除最后一个值,当 value=-1 删除第一个值
#删除了最后一个值
db.t_member.update({name:"zhangsan"},{$pop:{classes:1}})
- $pull : 删除指定数组指定的值
#$pullAll 批量删除指定数组
db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}})
- $ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:
db.t_member.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male "}})
runCommand 函数和 findAndModify 函数
runCommand({
findAndModify:"persons",
query:{查询器},
sort:{排序},
update:{修改器},
new:true 是否返回修改后的数据
});
runCommand 函数可执行 mongdb 中的特殊函数
findAndModify 就是特殊函数之一,用于返回执行返回 update 或 remove 后的文档 例如:
> db.runCommand({ findAndModify:"user", query:{name:"dukun"}, update:{$set:{age:16}}, new:true })
{
"lastErrorObject" : {
"n" : 1,
"updatedExisting" : true
},
"value" : {
"_id" : ObjectId("5d8985552eba8f32e136f0cc"),
"name" : "dukun",
"age" : 16,
"salary" : 11000,
"class" : [
"java",
"java",
"c"
],
"classes" : [
"English"
],
"ji" : [
"c"
]
},
"ok" : 1
}
- group 分组
db.runCommand({ group:{
ns:"集合的名字",
key:"分组键对象",
initial:"初始化累加器",
$reduce:"分解器",
condition:"条件",
finalize:"组完成器"
}})
分组首先会按照 key 进行分组,每组的 每一个文档全要执行$reduce 的方法,他接收 2 个参数一个是组 内本条记录,一个是累加器数据.
请查出 persons 中每个国家学生数学成绩最好的学生信息(必须在 90 以上)
db.runCommand({
group:{ ns:"persons",
key:{"country":true},
initial:{m:0},
$reduce:function(doc,prev) {
if(doc.m>prev.m){
prev.m = doc.m; prev.name = doc.m;
prev.country = doc.country; } },
condition:{m:{$gt:90}},
finalize:function(prev){
prev.m = prev.name+" comes from "+prev.country+" ,
Math score is "+prev.m; } }
})
MongoDB 索引
- 建索引
> db.user.ensureIndex({number:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
- 创建索引同时指定索引的名字
> db.user.ensureIndex({number:1},{"name":"d_"})
{
"ok" : 0,
"errmsg" : "Index with name: d_ already exists with a different name",
"code" : 85,
"codeName" : "IndexOptionsConflict"
}
索引使用需要注意的地方
1)创建索引的时候注意 1 是正序创建索引-1 是倒序创建索引
2)索引的创建在提高查询性能的同事会影响插入的性能 对于经常查询少插入的文档可以考虑用索引
3)符合索引要注意索引的先后顺序
4)每个键全建立索引不一定就能提高性能呢 索引不是万能的
5)在做排序工作的时候如果是超大数据量也可以考虑加上索引 用来提高排序的性能
- 唯一索引 解决文档 不能插入重复的数值
#则插入相同的 name 值会报错
db.user.ensureIndex({name:-1},{unique:true})
- 如果建议唯一索引之前已经有重复数值如何处理
#剔除重复数值
db.books.ensureIndex({name:1},{name:"book_",unique:true,dropDups:true })
- 后台执行创建索引
为了解决创建索引锁表的问题,在不影响查询功能,可以在后台运行
db.books.ensureIndex({name:1},{background:true})
- 强制查询已经建立好的索引 #后一个 name 为索引名,正序倒
#后一个 name 为索引名,正序倒序依据建立索引的规则,否则会报错 db.books.find({name:"323book"}).hint({name:1})
- 在 shell 查看数据库已经建立的索引
db.system.indexes.find()
db.system.namespaces.find()
- 查询索引信息和查询状态信息
db.books.find({name:"123book"}).explain()
- 批量和精确删除索引
db.runCommand({dropIndexes : "books" , index:"name_-1"})
db.runCommand({dropIndexes : "books" , index:"*"})