MongoDB3.4.2SQL查询语句详解
本⽂对 MongoDB 的⼀些基本操作做⼀下整理和总结。 ⾸先会介绍⼀下基于命令⾏的sql操作,其次结合 spring 的 mongoTemplate 介绍⼀下如何通过 java 操作数据库。对 NoSQL 不熟悉的同学可以了解⼀下。
1.版本
MongoDB 3.4.2
2.安装
安装 MongoDB 可以查看我的另外⼀篇⽂章
3.创建⽤户
关于⽤户创建和维护可以查看我的另外⼀遍⽂章
4.命令⾏CRUD操作
这以 testUser 这个集合为例⼦,下⾯的操作都是基于这个集合。
4.0 ⽰例
下⾯分享2个别⼈的教程,⼀个是官⽹的例⼦,⼀个是菜鸟教程。如果看我的内容有疑惑的话可以参考这2个教程。
4.1 插⼊
语法格式:
db.COLLECTION_NAME.insert(document)
例⼦:
> db.getCollection('testUser').insert({
name: 'a',
description: 'user a',
age: 15,
zone: 'shanghai'
})
WriteResult({ "nInserted" : 1 })
>
4.2 更新
语法格式:
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
> db.getCollection('testUser').update({
name: 'a'
}, {
$set: {
zone: 'hangzhou'
}
})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
这⾥需要注意, update ⼀共提供5个参数
query : update的查询条件,类似sql update查询内where后⾯的。
update : update的对象和⼀些更新的操作符(如$,$)等,也可以理解为sql update查询内set后⾯的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插⼊objNew,true为插⼊,默认是false,不插⼊。
multi : 可选,mongodb 默认是false,只更新到的第⼀条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
所以上⾯的例⼦update只会更新⼀条数据,如果需要更新多条,需要将第4个参数设置为true
name: 'a'
}, {
$set: {
zone: 'hangzhou'
}
}, false, true)
第3个参数 upsert 的意思是,如果根据条件查到记录了就更新该记录,如果没有查到记录就插⼊⼀条记录。
4.3 删除
语法:
<query>,
<justOne>
)
例⼦:
移除 name 字段为 a 的记录
&Collection('testUser').remove({
name: 'a'
})
4.4 查询
语法:
name: 'a'
})
查询 name 为 a, age ⼤于 14 的记录
name: 'a', age: {$gt: 14}
})
还有⼀些 in or nin gt lt gte 等 ⼤家可以意会⼀下,实在悟不出来可以点击
4.5 排序
语法:
db.COLLECTION_NAME.find().sort({KEY:1})
例⼦:
查询 name 为 a, age ⼤于 14 的记录, 按age升序排序。1 为升序,-1 为降序
name: 'a', age: {$gt: 14}
}).sort({age:1})
4.6 索引
语法:
db.sureIndex({KEY:1})
例⼦:
为 zone 字段添加升序索引,并且在后台执⾏
查看索引
5.命令⾏聚合操作
聚合操作语法就有点复杂了,结合mysql语法讲解⼀下
select zone, count(zone) from testUser group by zone
mongo
> db.getCollection('testUser').aggregate([{
$group: {
_id: "$zone",
num_total: {
$sum: 1
}
}
}])
{ "_id" : "hangzhou", "num_total" : 1 }
{ "_id" : "guangzhou", "num_total" : 500000 }
{ "_id" : "beijing", "num_total" : 2800000 }
{ "_id" : "shanghai", "num_total" : 400001 }
可以看到我这⼀个表⾥⾯有300多万数据,这个聚合执⾏下来 4.6 秒,还是挺快的。mysql
select zone, count(zone) from testUser where age <= 15 group by zone
mongo
> db.getCollection('testUser').aggregate([
{
$match: {
age: {$lte: 15}
}
},
{
$group: {
_id: "$zone",
count: {
$sum: 1
}
}
}
]
);
{ "_id" : "hangzhou", "count" : 1 }
{ "_id" : "guangzhou", "count" : 500000 }
{ "_id" : "beijing", "count" : 2800000 }
{ "_id" : "shanghai", "count" : 400001 }
mysql
select zone, avg(age), count(zone) from testUser where age <= 15 group by zone
> db.getCollection('testUser').aggregate([
{
$match: {
age: {$lte: 15}
}
},
{
$group: {
_id: "$zone",
avg: {
$avg: '$age'
},
count: {
$sum: 1
}
}
}
]);
{ "_id" : "hangzhou", "avg" : 15, "count" : 1 }
{ "_id" : "guangzhou", "avg" : 15, "count" : 500000 }
mongodb和mysql结合{ "_id" : "beijing", "avg" : 15, "count" : 2800000 }
{ "_id" : "shanghai", "avg" : 15, "count" : 400001 }
详细的讲解猛戳
6.命令⾏⾮交互式执⾏sql
/xxx/mongodb-osx-x86_64-3.4.2/bin/mongo <collection_name> -u<username> -p<password> --eval "db.getCollection('xxxx').find({})"
7.使⽤MongoTemplate操作数据库
7.1 插⼊
TestUser testUser = new TestUser();
testUser.setUserId(1);
testUser.setUsername("a");
testUser.setAge(15);
testUser.setZone("beijing");
mongoTemplate.save(testUser);
7.2 查询全部
List<TestUser> testUserList = mongoTemplate.find(new Query(), TestUser.class);
7.3 条件查询
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论