MongoDB基本命令
简单添加用户
MongoDB shell version: 3.4.*
>use admin
>db.createUser(
{
user: "root",
pwd: "abc123",
roles: [ { role: "root", db: "admin" } ]
}
)
>use test
>db.createUser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)
>use mydb
>db.createUser(
{
user: "mydbuser",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "mydb" },
{ role: "read", db: "test" } ]
}
)
删除用户
>use mydb
>db.dropUser("mydbuser");
启用认证参数,修改各节点配置文件
auth=true
关闭mongodb
启动mongodb
# /usr/local/mongodb/bin/mongo 192.168.1.103:27017/admin -u root -p abc123
# /usr/local/mongodb/bin/mongo 192.168.1.103:27017/mydb -u mydbuser -p xyz123
查看用户 :
> use test
> show users
查看集合结构
添加数据
>use test
>for(var i=1; i<=60000; i++) db.student.insert({age:i,name:"mary",addr:"bj",country:"China"})
>use mydb
>for(var i=1; i<=60000; i++) db.teacher.insert({age:i,name:"allen",addr:"sh",country:"China"})
//指定用户名和密码连接到指定的MongoDB数据库
mongo 10.10.165.90:27017/laxin -u laxin_user -p lx_rwx_2259
mongo 10.10.48.95:27017/admin -u root -p xR3i4jUq-2-GzRr2
db.currentOp(),db.currentOp(true)
Mongodb 的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,你可以通过db.currentOp()获取当前正在执行的操作。
连接数信息
>db.serverStatus().connections
查看数据库
> db.stats()
{
"db" : "laxin",
"collections" : 2,
"views" : 0,
"objects" : 539325,
"avgObjSize" : 584.1954276178557,
"dataSize" : 315071199,
"storageSize" : 124866560,
"numExtents" : 0,
"indexes" : 2,
"indexSize" : 12214272,
"ok" : 1
}
storageSize真正存储的大小,就是data。用WiredTiger压缩后的
indexSize索引的大小
dataSize未被压缩的大小
查看数据库表
> db.mpsGroupon.stats()
查看一个collection有多少记录
> db.mpsGroupon.count();
179476
> db.mpsGrouponMember.count()
359849
查看一个collection大小
> db.mpsGroupon.dataSize();
72149352
> db.mpsGrouponMember.dataSize()
242921847
查看所有参数值:
> use admin
> db.adminCommand({getParameter:"*"})
查看数据文件和日志文件路径:
> db.runCommand("getCmdLineOpts")
数据库常用命令
1)查看命令提示
>db.help();
2)切换/创建数据库
>use mydb;
3)查询所有数据库
>show dbs;
4)删除当前使用数据库
>db.dropDatabase();
5)从指定主机上克隆数据库
>db.cloneDatabase("192.168.199.9");
6)从指定的机器上复制指定数据库数据到某个数据库
>db.copyDatabase("mydb", "temp", "192.168.199.9");
7)修复当前数据库
>db.repairDatabase();
8)查看当前使用的数据库
>db.getName();
或者
>db;
9)显示当前db状态
>db.stats();
10)当前db版本
>db.version();
11)查看当前db的链接机器地址
>db.getMongo();
12)查询之前的错误信息
>db.getPrevError();
13)清除错误记录
>db.resetError();
集合
1)创建一个集合
>db.createCollection("mycoll");
2)显示当前数据库中的集合
>show collections;
3)使用集合
>db.mycoll
或者
>db.getCollection("mycoll")
4)查看集合命令帮助文档
>db.mycoll.help();
5)查询当前集合的数据条数
>db.mycoll.count();
6)查看集合数据大小
>db.mycoll.dataSize();
7)查看集合索引大小
>db.mycoll.totalIndexSize();
8)为集合分配的空间大小,包括未使用的空间
>db.mycoll.storageSize();
9)显示集合总大小,包括索引和数据的大小和分配空间的大小
>db.mycoll.totalSize();
db.mycoll.totalSize()=db.mycoll.storageSize()+db.mycoll.totalIndexSize()
10)显示当前集合所在的db
>db.mycoll.getDB();
11)显示当前集合的状态
>db.mycoll.stats();
12)集合的分片版本信息
>db.mycoll.getShardVersion();
13)集合重命名
>db.mycoll.renameCollection("users");
或者
>db.getCollection("mycoll").renameCollection("users");
14)显示当前db所有集合的状态信息
>db.printCollectionStats();
15)删除当前集合
>db.mycoll.drop();
文档
1)写入文档
>db.user.insert({"name":"joe"});
或者
>db.user.save({"name":"joe"});
2)查看文档
>db.user.find();
save与insert的区别在于不仅有写入数据功能还具有更新数据功能
MongoDB使用save()和update()方法来更新集合中的文档
3)更新文档
>db.user.save({"_id" : ObjectId("579036a9de4344710224234d"), "myName" : "joe", "age" : 20})
update()使用示例:
>db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,{multi:true},WriteConcern.SAFE);
>db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,true,WriteConcern.SAFE);
>db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,WriteConcern.SAFE);
>db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},{multi:1});
db.collection.update(
查询条件,
整个文档或者修改器,
upsert:boolean,
multi:boolean,
writeConcern:异常信息等级
)
4)删除文档
使用示例:
>db.user.remove({"myName" : "joe"},1);
>db.user.remove({"myName" : "joe"});
5)更新文档并返回文档
> db.user.insert({"name":"joe1","age":25});
> db.user.insert({"name":"joe2","age":26});
> db.user.insert({"name":"joe3","age":27});
> db.user.insert({"name":"joe4","age":28});
>db.user.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}}
});
或者
>db.runCommand({ findandmodify : "user",
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}}
});
db.COLLECTION_NAME.findAndModify({query:{},
update:{},
remove:true|false,
new:true|false,
sort:{},
fields:{},
upsert:true|false});
query是查询选择器,与findOne的查询选择器相同
update是要更新的值,不能与remove同时出现
remove表示删除符合query条件的文档,不能与update同时出现
new为true:返回个性后的文档,false:返回个性前的,默认是false
sort:排序条件,与sort函数的参数一致。
fields:投影操作,与find*的第二个参数一致。
upsert:与update的upsert参数一样。
6)删除文档并返回文档
>db.user.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
remove: true
});
或者
>db.runCommand({ findandmodify : "user",
query: {age: {$gte: 25}},
sort: {age: -1},
remove: true
});
7)查询满足条件的文档数量
>db.user.count({$or: [{age: 14}, {age: 28}]});
索引
1)创建索引
>db.user.ensureIndex({age: 1});
>db.user.ensureIndex({myName: 1, age: -1});
创建索引还可以搭配一些参数:
>db.test.ensureIndex({"username":1},{"background":true})
>db.test.ensureIndex({"userid":1},{"unique":true})
>db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})
>db.test.ensureIndex({"userid":1},{"unique":true,"sparse":true})
2)查询集合所有索引
>db.user.getIndexes();
3)查看集合总索引记录大小
>db.user.totalIndexSize();
4) 读取当前集合的所有index信息
>db.user.reIndex();
5) 删除指定索引
>db.user.dropIndex("myName");
6) 删除集合所有索引
>db.user.dropIndexes();
基本查询
find简介
>db.user.find();
>db.user.find().pretty();
括号中可以设置两个个参数,以逗号分隔识别
>db.user.find({"myName":"joe"},{"age":1})
游标
>var cursor= db.user.find();
>while(cursor.hasNext()){
var temp=cursor.next()
print(temp.myName);
}
游标还实现了迭代器接口,所以可以使用forEach。
>var cursor= db.user.find();
>cursor.forEach(function(temp){
print(temp.myName);
});
条件查询
与操作
>db.user.find({"myName":"joe","age":16})
或操作$or
>db.user.find({$or: [{age: 14}, {age: 28}]});
大于$gt
>db.user.find({age: {$gt: 20}})
小于$lt
>db.user.find({age: {$lt: 20}})
大于等于$gte
>db.user.find({age: {$gte: 20}})
小于等于$lte
>db.user.find({age: {$lte: 20}})
类型查询$type
使用方式如下:
>db.user.find( { "myName" : { $type : 2 } } );
>db.user.find( { "myName" : { $type : "string" } } );
是否存在$exists
>db.user.find({"age": {$exists: true}})
取模$mod
>db.user.find({"age": {$mod : [10, 0]}});
不等于$ne
>db.user.find({ "age" : { "$ne" : 23}})
包含$in
>db.user.find({ "myName" : { "$in" : [ "joe" , "ab"]}})
不包含$nin
>db.user.find({ "myName" : { "$nin" : [ "joe" , "ab"]}})
$not: 反匹配
以上所有字段查询操作都能取非,比如:
>db.user.find({ "myName" : { "$in" : [ "joe" , "ab"]}})
>db.user.find({ "myName" : {$not:{ "$in" : [ "joe" , "ab"]}}})
特定类型查询
null
>db.user.find({"company":null})
查询company字段为null的文档。
>db.user.find({"company":{$nin:[null]} })
查询company字段不为空的文档。
MongoDB中的正则用法
MongoDB使用//表示启用正则表达式,如下:
>db.user.find({"name":/^j/})
嵌套文档
BSON格式的文档是可以相互嵌套的,例如如下文档phone字段的值就是一个子文档:
{
"name" : "huangz",
"phone" : { "home" : 123321,
"mobile" : 15820123123}
}
精确匹配查询
指定完整的文档,查询出子文档完全匹配指定文档的文档。
>db.user.find({"phone":{"home" : 123321,"mobile" : 15820123123}})
点查询
如果我们不知道子文档的完整文档,只知道子文档中一个字段的值,可以通过点查询。
>db.user.find({"phone.home":123321})
数组
数组单元素查询
> db.user.insert({"name":"allen1","age":25,"favorite":[6]});
> db.user.insert({"name":"allen2","age":26,"favorite":[6,7]});
> db.user.insert({"name":"allen3","age":27,"favorite":[6,7,8]});
> db.user.insert({"name":"allen4","age":28,"favorite":[6,7,8,9]});
>db.user.find({favorite:6});
$all数组多元素查询
>db.user.find({favorite : {$all : [6, 8]}});
$size数组长度查询
>db.user.find({favorite: {$size: 3}});
返回数组子集
>db.user.find({},{favorite: {$slice: 2}});
>db.user.find({},{favorite: {$slice: -2}});
精确匹配查询
>db.user.find({favorite :[6, 7]});
点查询
点查询用于查询更复杂的数组,例如数组中包含的是子文档的情况:
{
"name" : "joe",
"phone" :[ { "home" : 123321,
"mobile" : 1854046352},
{ "home" : 123652,
"mobile" : 15820123123} ,
{ "home" : 123456,
"mobile" : 13820123123}
]
}
需要查询phone数组中子文档的home值为123456的文档,使用命令:
>db.user.find({"phone.home":123456});
索引查询
数组都有索引,例如[6,8],6是第0个元素,8是第1个元素(数组索引以0开头)。要查找某个元素指定值的文档可以使用点和索引值:
>db.user.find({"favorite_number.0":6});
点查询中只要数组的子文档里有一个home值满足查询值就会返回文档。如果我们要精确到第几个元素也可以用索引查询。
>db.user.find({"phone.2.home":123456});
高级查询$where
Javascript编程简单例子
>db.user.find().forEach(function(item){
if(item.age>18){
item.tag="adult";
}
db.user.save(item);
})
JavaScript与$where结合使用
>db.user.find({age: {$gt: 18}});
或者
>db.user.find({$where: "this.age > 18"});
或者
>db.user.find("this.age > 18");
或者
>f = function() {return this.age > 18}; db.user.find(f);
查询辅助
条数限制limit
>db.user.find().limit(2);
起始位置skip
>db.user.find().skip(3).limit(5);
排序sort
>db.user.find().sort({age: 1});
>db.user.find().sort({age: -1});
修改器
$set
>db.user.update({"name":"joe"},{$set:{"age":18,"company":"google"}});
$unset
>db.user.update({"name":"joe"},{$unset:{"company":1}});
$inc
>db.user.update({"name":"joe"},{$inc: {age: 50}});
$push
>db.user.update({"name":"joe"},{$push: {phone: {"home":456789,"mobile":"13562352412"}}});
$pushAll
>db.user.update({"name":"joe"},{$pushAll: {phone: [{"home":456789,"mobile":"13562352412"},
$pull
>db.user.update({"name":"joe"},{$pull: {phone:{"home": 456789} }});
$addToSet
>db.user.update({"name":"joe"},{$addToSet: {phone: {"home":456789,"mobile":"13562352412"}}});
$pop
>db.user.update({"name":"joe"},{$pop: {phone:1}});
$rename
>db.user.update({"name":"joe"},{$rename: {"phone":"call"}});
原生聚合运算
数量查询count
>db.user.count({age: {$gte: 18}})
不同值distinct
>db.runCommand({"distinct":"user", "key":"age"})
聚合管道aggregate
$match
>db.user.aggregate([
{
$match:{"name.last":"joe"}
}
])
$limit
>db.user.aggregate(
{ $limit : 1 }
);
$skip
>db.user.aggregate({ $skip : 2 });
$group
把数据根据age字段进行分组,使用命令:
>db.user.aggregate([{$group : {_id : "$age"}}])
$lookup
例子如下:
创建产品信息:
>db.product.insert({"_id":1,"name":"产品1","price":99})
>db.product.insert({"_id":2,"name":"产品2","price":88})
>db.order.insert({"_id":1,"pid":1,"name":"订单1"})
>db.order.insert({"_id":2,"pid":2,"name":"订单2"})
>db.order.insert({"_id":3,"pid":2,"name":"订单3"})
>db.order.insert({"_id":4,"pid":1,"name":"订单4"})
>db.order.insert({"_id":5,"name":"订单5"})
>db.order.insert({"_id":6,"name":"订单6"})
$lookup作左连接组合两个集合的信息使用命令如下:
>db.order.aggregate([
{
$lookup:
{
from: "product",
localField: "pid",
foreignField: "_id",
as: "orderDetail"
}
}
])
管道表达式
测试数据准备:
>db.product.insert({"_id":1,"name":"产品1","price":99,"type":"服装"})
>db.product.insert({"_id":2,"name":"产品2","price":88,"type":"服装"})
>db.product.insert({"_id":3,"name":"产品3","price":29,"type":"饰品"})
>db.product.insert({"_id":4,"name":"产品4","price":78,"type":"服装"})
>db.product.insert({"_id":5,"name":"产品5","price":9,"type":"饰品"})
>db.product.insert({"_id":6,"name":"产品6","price":18,"type":"饰品"})
数据如下:
> db.product.find()
{ "_id" : 1, "name" : "产品1", "price" : 99, "type" : "服装" }
{ "_id" : 2, "name" : "产品2", "price" : 88, "type" : "服装" }
{ "_id" : 3, "name" : "产品3", "price" : 29, "type" : "饰品" }
{ "_id" : 4, "name" : "产品4", "price" : 78, "type" : "服装" }
{ "_id" : 5, "name" : "产品5", "price" : 9, "type" : "饰品" }
{ "_id" : 6, "name" : "产品6", "price" : 18, "type" : "饰品" }
1)求和$sum
>db.product.aggregate([{$group : {_id : "$type", price : {$sum : "$price"}}}])
2)平均值$avg
>db.product.aggregate([{$group : {_id : "$type", price : {$avg : "$price"}}}])
3)最小值$min
>db.product.aggregate([{$group : {_id : "$type", price : {$min : "$price"}}}])
4)最大值$max
>db.product.aggregate([{$group : {_id : "$type", price : {$max : "$price"}}}])
复合使用示例
>db.user.aggregate([
{ $match: { age:{"$gt":13} } },
{ $sort: { age: 1 } },
{ $limit: 2 },
{ $group: { _id: "$age", "人数": { $sum: 1 } } },
]
)