本文对 MongoDB 的一些基本操做作一下整理和总结。 首先会介绍一下基于命令行的sql操做,其次结合 spring 的 mongoTemplate 介绍一下如何经过 java 操做数据库。对 NoSQL 不熟悉的同窗能够了解一下。html
MongoDB 3.4.2java
安装 MongoDB 能够查看个人另一篇文章 CentOs7 急速安装 MongoDBmysql
关于用户建立和维护能够查看个人另一遍文章 MongoDB 3.4.7 用户基本操做web
这以 testUser 这个集合为例子,下面的操做都是基于这个集合。spring
下面分享2个别人的教程,一个是官网的例子,一个是菜鸟教程。若是看个人内容有疑惑的话能够参考这2个教程。sql
语法格式:数据库
db.COLLECTION_NAME.insert(document)
例子:bash
> db.getCollection('testUser').insert({ name: 'a', description: 'user a', age: 15, zone: 'shanghai' }) WriteResult({ "nInserted" : 1 }) >
语法格式:app
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
例子:
查出 name 字段为 a 的记录,更新 zone 字段为 hangzhou
> db.getCollection('testUser').update({ name: 'a' }, { $set: { zone: 'hangzhou' } }) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
这里须要注意, update 一共提供5个参数
因此上面的例子update只会更新一条数据,若是须要更新多条,须要将第4个参数设置为true
db.getCollection('testUser').update({ name: 'a' }, { $set: { zone: 'hangzhou' } }, false, true)
第3个参数 upsert 的意思是,若是根据条件查到记录了就更新该记录,若是没有查到记录就插入一条记录。
语法:
db.collection.remove( <query>, <justOne> )
例子:
移除 name 字段为 a 的记录
>db.getCollection('testUser').remove({ name: 'a' })
语法:
db.collection.find(query, projection)
例子:
查询 name 为 a 的记录
db.getCollection('testUser').find({ name: 'a' })
查询 name 为 a, age 大于 14 的记录
db.getCollection('testUser').find({ name: 'a', age: {$gt: 14} })
还有一些 in or nin gt lt gte 等 你们能够意会一下,实在悟不出来能够点击这里
语法:
db.COLLECTION_NAME.find().sort({KEY:1})
例子:
查询 name 为 a, age 大于 14 的记录, 按age升序排序。1 为升序,-1 为降序
db.getCollection('testUser').find({ name: 'a', age: {$gt: 14} }).sort({age:1})
语法:
db.COLLECTION_NAME.ensureIndex({KEY:1})
例子:
为 zone 字段添加升序索引,而且在后台执行
db.getCollection('testUser').ensureIndex({zone:1}, {background: true})
查看索引
db.getCollection('testUser').getIndexes()
聚合操做语法就有点复杂了,结合mysql语法讲解一下
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
mongo
> 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 } { "_id" : "beijing", "avg" : 15, "count" : 2800000 } { "_id" : "shanghai", "avg" : 15, "count" : 400001 }
详细的讲解猛戳这里
/xxx/mongodb-osx-x86_64-3.4.2/bin/mongo <collection_name> -u<username> -p<password> --eval "db.getCollection('xxxx').find({})"
TestUser testUser = new TestUser(); testUser.setUserId(1); testUser.setUsername("a"); testUser.setAge(15); testUser.setZone("beijing"); mongoTemplate.save(testUser);
List<TestUser> testUserList = mongoTemplate.find(new Query(), TestUser.class);
Query query = new Query(); query.addCriteria(Criteria.where("zone").is("shanghai")); List<TestUser> testUserList = mongoTemplate.find(query, TestUser.class);
Query query = new Query(); query.addCriteria(Criteria.where("userId").is(1)); Update update = new Update(); update.set("age", 22); mongoTemplate.updateFirst(query, update, TestUser.class);
Query query = new Query(); query.addCriteria(Criteria.where("userId").is(1)); Update update = new Update(); update.set("age", 22); mongoTemplate.upsert(query, update, TestUser.class);
Query query = new Query(); query.addCriteria(Criteria.where("userId").is(1)); Update update = new Update(); update.set("age", 22); mongoTemplate.updateMulti(query, update, TestUser.class);
Aggregation aggregation = newAggregation( match(Criteria.where("zone").is("guangzhou")), group().avg("age").as("avg_age").count().as("count") ); AggregationResults<HashMap> aggregationResults = mongoTemplate.aggregate(aggregation, "testUser", HashMap.class); List<HashMap> rs = aggregationResults.getMappedResults();
查询 zone 等于 guangzhou 的记录,按 zone 统计条数和平均年龄
Aggregation aggregation = newAggregation( group("zone").count().as("count") ); AggregationResults<HashMap> aggregationResults = mongoTemplate.aggregate(aggregation, "testUser", HashMap.class); List<HashMap> rs = aggregationResults.getMappedResults();
按 zone 统计条数
TestUser testUser = new TestUser(); testUser.setUserId(i); testUser.setUsername("a"); testUser.setAge(15); testUser.setZone("beijing"); mongoTemplate.remove(testUser);
看到别人遇到过 groupby 产生的超出内存大小的限制,可是本身没有复现出来。就放2个地址记录下别人的经验。