====【MongoDB服务启动&链接】====
[root@CentOS ~]# mongod --port 27017 --dbpath /root/data/db/ --fork --syslog【后台】
[root@CentOS ~]# mongod --port 27017 --dbpath /root/data/db/ 【前台】
====【MongoDB常规数据类型】====
Double、 String 、 Object 、
Array 、 ObjectId 、Boolean 、
Date 、 Null 、Timestamp
数据类型:https://docs.mongodb.com/manual/reference/operator/query/type/#document-querying-by-data-type
====【常见的Shell】====
数据库
①创建数据
>use 数据库名;
②删除数据
>db.dropDatabase();
③查看Database
>show dbs|databases
④查看当前数据库
>db
集合
①创建
db.createCollection("t_user"); --建表
②固定集合:capped:必须为true、size单位KB、max最大元素。
db.createCollection("t_user",{
capped:true,
size:1,
max:2
});
说明:如果超过指定大小则,丢弃前面的元素,使用db.t_user.isCapped()
判断集合是否是固定集合。
③约束 (了解)
db.createCollection("t_user",
{ validator:{
$and:[
{name:{$type:'string',$exists:true}},
{age:{$type:'int',$exists:true}},
{sex:{$type:'bool',$exists:true}},
{birthDay:{$type:'date',$exists:true}}
]}
});
> db.t_user.insert({
name:"zhangsan",
age:NumberInt(18),
sex:true,
birthDay:new Date("1990-12-13")
});
更多参考:https://docs.mongodb.com/manual/core/document-validation/
====【MongoDB CRUD】====
①插入
> db.t_user.insertOne({id:1,name:'jiangzz'})
> db.t_user.insertMany([{id:2,name:'lisi'},{id:3,name:'wangwu'}])
> db.t_user.insert([{id:4,name:'zhaoliu'},{id:5,name:'win7'}])
注意:MongoDB的每条记录都有一个ObjectId,必须保持唯一。如果当用户
不指定的时候由系统自动生成。
mongodb insert()和save()的相同点和区别?
> db.t_user.insert({_id:1,name:"zs"})
> db.t_user.insert({_id:1,name:"lisi"})
> db.t_user.save({_id:1,name:"wangwu"})
> db.t_user.save({_id:1,name:"zhaoliu"})
总结:若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改
原来的内容为新内容。若新增的数据中没有主键时,都会增加一条记录。
②更新 multi、upsert 、$set/$unset/$incr
> db.t_user.updateOne({id:1},{$set:{salary:10000}})
> db.t_user.updateMany({id:{$gte:2}},{$set:{salary:10000}})
> db.t_user.replaceOne({id:1},{name:"jiangzz1"})
> db.t_user.update({id:1},{$set:{name:"jzz"}})
> db.t_user.update({name:"ww"},{$inc:{salary:1000}},{multi:true})
> db.t_user.update({id:1},{$inc:{salary:1000}},{multi:true})
> db.t_user.update({id:2},{$inc:{salary:1000}},{multi:true,upsert:true})
更多:https://docs.mongodb.com/manual/reference/operator/update/
③删除
> db.t_user.remove({salary:10000},{justOne:true})
等价
> db.t_user.deleteOne({salary:10000})
-------------------------------------------------
> db.t_user.remove({salary:10000})
等价
> db.t_user.deleteMany({salary:10000})
④查询(重点)
→查询Embedded/Nested文档
db.t_store.insert( [
{ item: "iphone6s", category: '手机', size: { h: 14, w: 21, type: "厘米" }, status: "A" },
{ item: "笔记本", category:'电脑', size: { h: 8.5, w: 11, type: "英尺" }, status: "A" }
]);
> db.t_store.find( { size: { w:21, h:14, type: "厘米" } } ) --错误
> db.t_store.find( { size: { h:14, w:21, type: "厘米" } } )
> db.t_store.find( { 'size.type': "厘米" } )
> db.t_store.find( { "size.h": { $lt: 15 } } )
→数组查询
db.t_store.insert( [
{ item: "iphone6s", category: '手机', color:["土豪金","玫瑰金","银灰色"]},
{ item: "笔记本", category:'电脑', color:["黑色","土豪金"]}
]);
> db.t_store.find({color:"土豪金"});
> db.t_store.find({color:{$all:["土豪金","玫瑰金"]}});
> db.t_store.find({'color.1':"土豪金"})
> db.t_store.find({color:{$size:3}});
→查询数组内嵌文档
db.t_user.insert( [
{ name: "张小三",age:20,friends:[{name:"李晓思",age:25},{name:"王小五",age:22}]},
{ name: "李晓思",age:25,friends:[{name:"张小三",age:20},{name:"温晓琪",age:30}]}
]);
> db.t_user.find({'friends.0.name':'李晓思'})
> db.t_user.find({"friends.age":{$gt:25}})
> db.t_user.find({"friends":{$elemMatch:{age:{$gt:25}}}})
→Project Fields
> db.t_user.find({},{name:true,'friends':true})
> db.t_user.find({},{name:true,'friends.name':true})
→查询null和空值
db.t_null.insert([
{_id:1,item:null},
{_id:2}
])
> db.t_null.find({item:null});
{ "_id" : 1, "item" : null }
{ "_id" : 2 }
> db.t_null.find( { item : { $type: 10 } } )
{ "_id" : 1, "item" : null }
> db.t_null.find( { item : {$exists: false } } )
{ "_id" : 2 }
> db.t_null.find( { item : {$exists:true} } )
{ "_id" : 1, "item" : null }
====【操作符】====
比较操作符:$eq、$gt、$gte、$lt、$lte、$ne、$in、$nin
逻辑操作符: $or、$and、$not、$nor
元素操作符:$exists、$type
求值搜索符:$mod、$regex、$where
数组查询符: $all、$elemMatch、$size
db.t_user.insert( [
{ name: "张小三",age:20,friends:[{name:"李晓思",age:25},{name:"王小五",age:22}]},
{ name: "李晓思",age:25,friends:[{name:"张小三",age:20},{name:"温晓琪",age:30}]}
]);
1.查询年龄大于20~30之间且薪资小于10000
db.t_user.find({$and:[{age:{$gt:20,$lt:30}},{salary:{$gt:10000}}]})
2.查询年龄是奇数的用户:
db.t_user.find({age:{$mod:[1,1]}})
3.使用where实现数据的age[10,30]区间数据
db.t_user.find({$where:"return this.age>10 && this.age<30"})
4.查询姓张的用户
db.t_user.find({name:{$regex:"^张"}});
5.查询朋友中有年龄大于25岁的
db.t_user.find({"friends":{$elemMatch:{age:{$gt:25}}}})
====【分页&排序 skip、limit、sort排序】====
db.t_user.find().skip(1).limit(1)
db.t_user.find().skip(0).limit(10).sort({age:1});
====【聚合函数】====
db.t_user.insert([
{name:"张三",sex:true,class:"软开1班",age:28,salary:18000},
{name:"李四",sex:true,class:"软开2班",age:25,salary:15000},
{name:"王五",sex:false,class:"软开1班",age:35,salary:10000},
{name:"赵六",sex:true,class:"软开2班",age:20,salary:15000}
]);
1.统计班级人员的平均薪资
db.t_user.aggregate([{$group:{_id:'$class',avgSalary:{$avg:'$salary'}}}]);
2.分析班级中薪资大于10000学生的平均年龄
db.t_user.aggregate([{$match:{salary:{$gt:10000}}},{$group:{_id:'$class',avgAge:{$avg:'$age'}}}]);
3.求每一个班中薪资最高薪资
db.t_user.aggregate([{$group:{_id:'$class',maxSalary:{$max:'$salary'}}}]);
4.求每一个班中薪资最低薪资
db.t_user.aggregate([{$group:{_id:'$class',minSalary:{$min:'$salary'}}}]);
5.求每一个班中薪资最低薪资班级降序
db.t_user.aggregate([{$group:{_id:'$class',minSalary:{$min:'$salary'}}},{$sort:{_id:-1}}]);
6.按照班级平均薪资降序
db.t_user.aggregate([{$group:{_id:'$class',avgSalary:{$avg:'$salary'}}},{$sort:{avgSalary:-1}}]);
7.求班级平均薪资最高的班级信息
db.t_user.aggregate([{$group:{_id:'$class',avgSalary:{$avg:'$salary'}}},{$sort:{avgSalary:1}},{$limit:1},{$skip:1}]);
MapReduce 统计参考:https://docs.mongodb.com/manual/aggregation/#map-reduce
====【MongoDB 索引】=====
1.单Field索引: db.records.createIndex( { score: 1 } )
2.复合索引 : db.collection.createIndex({ score: 1,name:-1 } )
3.唯一索引 : db.members.createIndex({"user_id":1},{unique:true})
4.稀疏索引 : db.t_user.createIndex({name:1},{sparse:true});
5.部分索引 :
db.t_user.createIndex({name:1},
{partialFilterExpression:{
age:{$gt:18}
},
unique:true
})
删除索引
db.t_user.dropIndex({name:1});
db.t_user.dropIndexes();
db.t_user.explain("executionStats");
====【Java API MongoDB Driver】=====
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.4.3</version>
</dependency>
[root@CentOS ~]# mongod --port 27017 --dbpath /root/data/db/ --fork --syslog【后台】
[root@CentOS ~]# mongod --port 27017 --dbpath /root/data/db/ 【前台】
====【MongoDB常规数据类型】====
Double、 String 、 Object 、
Array 、 ObjectId 、Boolean 、
Date 、 Null 、Timestamp
数据类型:https://docs.mongodb.com/manual/reference/operator/query/type/#document-querying-by-data-type
====【常见的Shell】====
数据库
①创建数据
>use 数据库名;
②删除数据
>db.dropDatabase();
③查看Database
>show dbs|databases
④查看当前数据库
>db
集合
①创建
db.createCollection("t_user"); --建表
②固定集合:capped:必须为true、size单位KB、max最大元素。
db.createCollection("t_user",{
capped:true,
size:1,
max:2
});
说明:如果超过指定大小则,丢弃前面的元素,使用db.t_user.isCapped()
判断集合是否是固定集合。
③约束 (了解)
db.createCollection("t_user",
{ validator:{
$and:[
{name:{$type:'string',$exists:true}},
{age:{$type:'int',$exists:true}},
{sex:{$type:'bool',$exists:true}},
{birthDay:{$type:'date',$exists:true}}
]}
});
> db.t_user.insert({
name:"zhangsan",
age:NumberInt(18),
sex:true,
birthDay:new Date("1990-12-13")
});
更多参考:https://docs.mongodb.com/manual/core/document-validation/
====【MongoDB CRUD】====
①插入
> db.t_user.insertOne({id:1,name:'jiangzz'})
> db.t_user.insertMany([{id:2,name:'lisi'},{id:3,name:'wangwu'}])
> db.t_user.insert([{id:4,name:'zhaoliu'},{id:5,name:'win7'}])
注意:MongoDB的每条记录都有一个ObjectId,必须保持唯一。如果当用户
不指定的时候由系统自动生成。
mongodb insert()和save()的相同点和区别?
> db.t_user.insert({_id:1,name:"zs"})
> db.t_user.insert({_id:1,name:"lisi"})
> db.t_user.save({_id:1,name:"wangwu"})
> db.t_user.save({_id:1,name:"zhaoliu"})
总结:若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改
原来的内容为新内容。若新增的数据中没有主键时,都会增加一条记录。
②更新 multi、upsert 、$set/$unset/$incr
> db.t_user.updateOne({id:1},{$set:{salary:10000}})
> db.t_user.updateMany({id:{$gte:2}},{$set:{salary:10000}})
> db.t_user.replaceOne({id:1},{name:"jiangzz1"})
> db.t_user.update({id:1},{$set:{name:"jzz"}})
> db.t_user.update({name:"ww"},{$inc:{salary:1000}},{multi:true})
> db.t_user.update({id:1},{$inc:{salary:1000}},{multi:true})
> db.t_user.update({id:2},{$inc:{salary:1000}},{multi:true,upsert:true})
更多:https://docs.mongodb.com/manual/reference/operator/update/
③删除
> db.t_user.remove({salary:10000},{justOne:true})
等价
> db.t_user.deleteOne({salary:10000})
-------------------------------------------------
> db.t_user.remove({salary:10000})
等价
> db.t_user.deleteMany({salary:10000})
④查询(重点)
→查询Embedded/Nested文档
db.t_store.insert( [
{ item: "iphone6s", category: '手机', size: { h: 14, w: 21, type: "厘米" }, status: "A" },
{ item: "笔记本", category:'电脑', size: { h: 8.5, w: 11, type: "英尺" }, status: "A" }
]);
> db.t_store.find( { size: { w:21, h:14, type: "厘米" } } ) --错误
> db.t_store.find( { size: { h:14, w:21, type: "厘米" } } )
> db.t_store.find( { 'size.type': "厘米" } )
> db.t_store.find( { "size.h": { $lt: 15 } } )
→数组查询
db.t_store.insert( [
{ item: "iphone6s", category: '手机', color:["土豪金","玫瑰金","银灰色"]},
{ item: "笔记本", category:'电脑', color:["黑色","土豪金"]}
]);
> db.t_store.find({color:"土豪金"});
> db.t_store.find({color:{$all:["土豪金","玫瑰金"]}});
> db.t_store.find({'color.1':"土豪金"})
> db.t_store.find({color:{$size:3}});
→查询数组内嵌文档
db.t_user.insert( [
{ name: "张小三",age:20,friends:[{name:"李晓思",age:25},{name:"王小五",age:22}]},
{ name: "李晓思",age:25,friends:[{name:"张小三",age:20},{name:"温晓琪",age:30}]}
]);
> db.t_user.find({'friends.0.name':'李晓思'})
> db.t_user.find({"friends.age":{$gt:25}})
> db.t_user.find({"friends":{$elemMatch:{age:{$gt:25}}}})
→Project Fields
> db.t_user.find({},{name:true,'friends':true})
> db.t_user.find({},{name:true,'friends.name':true})
→查询null和空值
db.t_null.insert([
{_id:1,item:null},
{_id:2}
])
> db.t_null.find({item:null});
{ "_id" : 1, "item" : null }
{ "_id" : 2 }
> db.t_null.find( { item : { $type: 10 } } )
{ "_id" : 1, "item" : null }
> db.t_null.find( { item : {$exists: false } } )
{ "_id" : 2 }
> db.t_null.find( { item : {$exists:true} } )
{ "_id" : 1, "item" : null }
====【操作符】====
比较操作符:$eq、$gt、$gte、$lt、$lte、$ne、$in、$nin
逻辑操作符: $or、$and、$not、$nor
元素操作符:$exists、$type
求值搜索符:$mod、$regex、$where
数组查询符: $all、$elemMatch、$size
db.t_user.insert( [
{ name: "张小三",age:20,friends:[{name:"李晓思",age:25},{name:"王小五",age:22}]},
{ name: "李晓思",age:25,friends:[{name:"张小三",age:20},{name:"温晓琪",age:30}]}
]);
1.查询年龄大于20~30之间且薪资小于10000
db.t_user.find({$and:[{age:{$gt:20,$lt:30}},{salary:{$gt:10000}}]})
2.查询年龄是奇数的用户:
db.t_user.find({age:{$mod:[1,1]}})
3.使用where实现数据的age[10,30]区间数据
db.t_user.find({$where:"return this.age>10 && this.age<30"})
4.查询姓张的用户
db.t_user.find({name:{$regex:"^张"}});
5.查询朋友中有年龄大于25岁的
db.t_user.find({"friends":{$elemMatch:{age:{$gt:25}}}})
====【分页&排序 skip、limit、sort排序】====
db.t_user.find().skip(1).limit(1)
db.t_user.find().skip(0).limit(10).sort({age:1});
====【聚合函数】====
db.t_user.insert([
{name:"张三",sex:true,class:"软开1班",age:28,salary:18000},
{name:"李四",sex:true,class:"软开2班",age:25,salary:15000},
{name:"王五",sex:false,class:"软开1班",age:35,salary:10000},
{name:"赵六",sex:true,class:"软开2班",age:20,salary:15000}
]);
1.统计班级人员的平均薪资
db.t_user.aggregate([{$group:{_id:'$class',avgSalary:{$avg:'$salary'}}}]);
2.分析班级中薪资大于10000学生的平均年龄
db.t_user.aggregate([{$match:{salary:{$gt:10000}}},{$group:{_id:'$class',avgAge:{$avg:'$age'}}}]);
3.求每一个班中薪资最高薪资
db.t_user.aggregate([{$group:{_id:'$class',maxSalary:{$max:'$salary'}}}]);
4.求每一个班中薪资最低薪资
db.t_user.aggregate([{$group:{_id:'$class',minSalary:{$min:'$salary'}}}]);
5.求每一个班中薪资最低薪资班级降序
db.t_user.aggregate([{$group:{_id:'$class',minSalary:{$min:'$salary'}}},{$sort:{_id:-1}}]);
6.按照班级平均薪资降序
db.t_user.aggregate([{$group:{_id:'$class',avgSalary:{$avg:'$salary'}}},{$sort:{avgSalary:-1}}]);
7.求班级平均薪资最高的班级信息
db.t_user.aggregate([{$group:{_id:'$class',avgSalary:{$avg:'$salary'}}},{$sort:{avgSalary:1}},{$limit:1},{$skip:1}]);
MapReduce 统计参考:https://docs.mongodb.com/manual/aggregation/#map-reduce
====【MongoDB 索引】=====
1.单Field索引: db.records.createIndex( { score: 1 } )
2.复合索引 : db.collection.createIndex({ score: 1,name:-1 } )
3.唯一索引 : db.members.createIndex({"user_id":1},{unique:true})
4.稀疏索引 : db.t_user.createIndex({name:1},{sparse:true});
5.部分索引 :
db.t_user.createIndex({name:1},
{partialFilterExpression:{
age:{$gt:18}
},
unique:true
})
删除索引
db.t_user.dropIndex({name:1});
db.t_user.dropIndexes();
db.t_user.explain("executionStats");
====【Java API MongoDB Driver】=====
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.4.3</version>
</dependency>
参考:http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/connect-to-mongodb/
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.6.3</version> </dependency>
package testmongo; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import org.bson.Document; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestClient { MongoClient mongoClient=null; @Before public void testbefore(){ mongoClient = new MongoClient("192.168.18.135"); } @Test public void testinsertOne(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); Document document = new Document("name","mongodb").append("type","database") .append("count",1).append("versions", Arrays.asList("v3.2","v3.6","v6.6")) .append("info",new Document("x",333).append("y",666)); collection.insertOne(document); } @Test public void testInsertMany(){ List<Document> documents = new ArrayList<Document>(); for (int i=0;i<10;i++) { documents.add(new Document("i",i)); } MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); collection.insertMany(documents); } @Test public void testupdateOne(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); UpdateResult updateResult = collection.updateOne(new Document("i", 2), new Document("$set", new Document("i", 22))); System.out.println(updateResult); } @Test public void testupdateMany(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); UpdateResult updateResult = collection.updateMany(new Document("i", 3), new Document("$set", new Document("bbb", 666))); System.out.println(updateResult); } @Test public void testupdeleteOne(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); DeleteResult i = collection.deleteOne(new Document("i", 0)); System.out.println(i); } @Test public void testupdeleteMany(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); DeleteResult i = collection.deleteMany(new Document("name", "zz")); System.out.println(i); } @Test public void testupdeleteOfind(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); FindIterable<Document> documents = collection.find(); for (Document document : documents) { System.out.println(document); } } @Test public void testupdeleteOfindOne(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); FindIterable<Document> documents = collection.find(new Document("name", "郝帅")); for (Document document : documents) { System.out.println(document); } } @Test public void testupdeleteOfindBy$in(){ MongoDatabase database = mongoClient.getDatabase("test1"); MongoCollection<Document> collection = database.getCollection("user"); FindIterable<Document> documents = collection.find(new Document("i",new Document("$in",Arrays.asList(1,2,3,4,5)))); for (Document document : documents) { System.out.println(document); } } @After public void testafter(){ mongoClient.close(); } }