1. 运行Mongodb
直接到官网下载即可进行安装,官网地址:https://www.mongodb.com/download-center?initial=true#community 这里不过多讲解.
连接Mongodb时注意,要先启动mongodb,否则连接失败。
运行MongoDB服务器:
mongod.exe --dbpath d:\mongodb\data\db
window下使其作为服务运行:
mongod.exe --bind_ip 127.0.0.1 --logpath "D:\mongodb\data\dbConf\mongodb.log" --logappend --dbpath "D:\mongodb\data\db" --port 27017 --serviceName "mongodbService" --serviceDisplayName "mongodb27017" --install
操作Mongodb
- 创建数据库
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
- 显示数据库
show dbs
- 显示当前连接的数据库
db
- 删除数据库
db.dropDatabase()
删除成功结果:
{ "dropped" : "dbtest", "ok" : 1 }
在当前所选的数据库下,执行,即可删除其数据库。
- 删除集合
db.COLLECTION.drop()
- 插入文档
db.COLLECTION.insert(document)
document为Json格式,例如
db.dbtest.insert({title:'MongoDB',
description:'MongoDB is a Nosql database.',
url:'http://www.mongodb.com',
tags:['mongodb','database','NoSQL']
})
- 更新文档
语法
db.COLLECTION.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
举例
db.dbtest.update({'title':'MongoDB'},{$set:{'title':'mongodb study'}})
结果:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
- 保存文档
语法
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
document : 文档数据。
writeConcern :可选,抛出异常的级别。
- 删除文档
db.collection.remove(
<query>,
<justOne>
)
2.6 以上版本
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
实例
db.dbtest.remove({'_id' : ObjectId('5916a9ed3e952ce60cc9bfe6')})
结果
WriteResult({ "nRemoved" : 1 })
清空集合
db.COLLECTION.remove{()}
- 查询文档
(需要先到对应Collection下)
语法
db.COLLECTION.find(query, projection).pretty()
.pretty()
可以格式化结果。
其它的查询详情http://www.runoob.com/mongodb/mongodb-query.html
示例
类似常规 SQL 语句为:
'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
- 条件操作符
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
示例
获取"col"集合中 “likes” 小于 150 的数据
db.col.find({likes:{$lt:150}})
类似于SQL语句:
Select * from col where likes < 150;
- limit()方法
语法
db.COLLECTION.find().limit(NUMBER)
limit()
方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
- Skip()方法
语法
db.COLLECTION.find().limit(NUMBER).skip(NUMBER)
skip
方法同样接受一个数字参数作为跳过的记录条数。
NOTE:
limit
和Skip
可用于分页
- 排序
语法
db.COLLECTION.find().sort({KEY:1})
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
- 索引
使用ensureIndex()方法创建索引
语法
db.COLLECTION.ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
在后台创建索引:
db.values.ensureIndex({open: 1, close: 1}, {background: true})
通过在创建索引时加background:true 的选项,让创建工作在后台执行
- 聚合
聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
语法
db.COLLECTION.aggregate(AGGREGATE_OPERATION)
详解
http://www.runoob.com/mongodb/mongodb-aggregate.html
其中一条数据:
{
"_id" : ObjectId("5baef313b35a1ab2e81f01ee"),
"_class" : "com.yylc.marketmng.common.dal.mongodb.dataobject.StatisticDataDo",
"typeId" : "5baeed37b35a1ab2e81f01e6",
"type" : "test_amount2",
"data" : {
"date" : ISODate("2018-09-26T16:00:00.000Z"),
"amount" : 12.444
},
"gmtCreate" : ISODate("2018-09-29T03:35:47.794Z")
}
聚合统计amount
db.getCollection('operation.data').aggregate(
[
{$unwind: "$data"},
{$match:{type:'test_amount2'}},
{$group:{_id:"$type",total:{$sum:'$data.amount'}}}
])
java使用MongoTemplete进行聚合操作
接近原始的方式
List<DBObject> pipeline = new ArrayList<DBObject>();
pipeline.add(new BasicDBObject("$unwind","$data"));
pipeline.add(new BasicDBObject("$match",new BasicDBObject("type","test_amount2")));
pipeline.add(new BasicDBObject("$group", new BasicDBObject("_id","$type")
.append("总金额",new BasicDBObject("$sum", "$data.amount"))));
//old
AggregationOutput output = optMongo.getCollection("operation.data").aggregate(pipeline);
//new
Cursor aggregate = optMongo.getCollection(optMongo.getCollectionName(StatisticDataDo.class)).aggregate(pipeline,
AggregationOptions.builder().build());
通过template封装的(1.9.10使用不了,会报游标相关异常)
Aggregation aggregation = Aggregation.newAggregation(Aggregation.unwind("$data"),
Aggregation.match(Criteria.where("type").is(statisticModelDO.getType())),
Aggregation.group("type").sum("$data.amount").as("总金额")
);
optMongo.aggregate(aggregation, "operation.data", BasicDBObject.class);
- 复制(副本级)
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
-
分片
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。 -
备份与恢复
在bin目录下执行,或者设置了环境变量。
- 数据备份
使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中
语法
mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:
需要备份的数据库实例,例如:dbtest,注意dbtest要为存在的实例名
-o:
备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
- 数据恢复:
语法
mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017
–db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
–drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
<path> :
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
–dir:
指定备份的目录
你不能同时指定
16. MongoDB监控
MongoDB中提供了
mongostat
和
mongotop
两个命令来监控MongoDB的运行情况。
mongostat
是
mongodb
自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。
在bin下输入
mongostat
mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。
mongotop
每十秒记录一次
mongotop 10
java操作Mongodb
在进行UpdateMulti(DBObject q,DBObject o)时,出现:
com.mongodb.WriteConcernException: { "serverUsed" : "127.0.0.1:27017" , "ok" : 1 , "n" : 0 , "updatedExisting" : false , "err" : "multi update only works with $ operators" , "code" : 9}
- updatedExisting参数设置为true,表示如果不存在则插入一条,如果存在直接更新;multi设置为true,表示更新多行
- 此处的更新会重写该条记录,即擦除之前的纪录,_id保持不变
- 此处更新不能使用多行更新,会报错multi update only works with $ operators
col.updateMulti(new BasicDBObject().append("name", "hgs"), new BasicDBObject().append("name", "hgsNew"));
第二种更新方式,就是更新指定字段,此种方法可以使用多行更新,此处只做一个实例
BasicDBObject updateObj=new BasicDBObject("$set",new BasicDBObject("name","newHGS"));
col.update(new BasicDBObject().append("name", "hgs"), updateObj,false,true);
MongoTemplate 拓展操作
public class OptMongo extends MongoTemplate {
private static final Logger logger = Logger.getLogger(OptMongo.class);
public OptMongo(Mongo mongo, String databaseName) {
super(mongo, databaseName);
}
public OptMongo(Mongo mongo, String databaseName, UserCredentials userCredentials) {
super(mongo, databaseName, userCredentials);
}
public OptMongo(MongoDbFactory mongoDbFactory) {
super(mongoDbFactory);
}
public OptMongo(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter) {
super(mongoDbFactory, mongoConverter);
}
/**
* 初始化collection,存在则返回collection,不存在则创建一个collection
* @param collectionName
* @return
*/
public DBCollection initCollection(String collectionName) {
DBCollection dbCollection;
if (collectionExists(collectionName)) {
dbCollection = createCollection(collectionName);
} else {
dbCollection = getCollection(collectionName);
}
return dbCollection;
}
@Override
public void insert(Object object) {
try {
super.insert(object);
} catch (Exception e) {
LogUtil.error(logger, e, MessageFormat.format("mongodb 插入异常object:{0}", object));
throw new RuntimeException(MessageFormat.format("mongodb 插入异常object:{0}", object));
}
}
/**
* 分页查询
* @param skip
* @param limit
* @param clazz
* @param <T>
* @return
*/
public <T> List<T> findForPage(Criteria criteria, int skip, int limit, Class<T> clazz) {
Query query = new Query();
query.limit(limit);
query.skip(skip);
query.addCriteria(criteria);
List<T> result = super.find(query, clazz);
return result;
}
/** 删除操作 **/
@Override
public WriteResult remove(Object object) {
WriteResult result = WriteResult.unacknowledged();
try {
result = super.remove(object);
} catch (Exception e) {
LogUtil.error(logger, e, "mongodb 删除异常 object:{0}", object);
}
return result;
}
@Override
public <T> List<T> findAllAndRemove(Query query, Class<T> clazz) {
List<T> allAndRemove = new ArrayList<>();
try {
allAndRemove = super.findAllAndRemove(query, clazz);
} catch (Exception e) {
LogUtil.error(logger, e, "mongodb 条件删除异常Query:{0},Object:{1}", query, clazz);
}
return allAndRemove;
}
/** 添加和删除索引**/
public void addIndex(Index index, String collectionName) {
IndexOperations indexOperations = super.indexOps(collectionName);
indexOperations.ensureIndex(index);
}
public void addIndex(Index index, Class clazz) {
IndexOperations indexOperations = super.indexOps(clazz);
indexOperations.ensureIndex(index);
}
public void removeIndex(String indexName, String collectionName) {
IndexOperations indexOperations = super.indexOps(collectionName);
indexOperations.dropIndex(indexName);
}
public void removeIndex(String indexName, Class clazz) {
IndexOperations indexOperations = super.indexOps(clazz);
indexOperations.dropIndex(indexName);
}
/**
* 获取所有索引
* @param clazz
* @return
*/
public List<IndexInfo> getAllIndexs(Class clazz) {
IndexOperations indexOperations = super.indexOps(clazz);
return indexOperations.getIndexInfo();
}
/**
* 判断是否存在索引
* @param field 字段
* @param clazz
* @return
*/
public boolean isExistIndex(String field, Class clazz) {
IndexOperations indexOperations = super.indexOps(clazz);
for (IndexInfo indexInfo : indexOperations.getIndexInfo()) {
if (indexInfo.isIndexForFields(Collections.singletonList(field))) {
return true;
}
}
return false;
}
}
SpringBoot中配置:
yaml配置文件
spring:
data:
mongodb:
host: 127.0.0.1
port: 27017
database: beedo
创建OptMongo bean
@Bean
public OptMongo optMongo(MongoDbFactory mongoDbFactory, MongoConverter converter) {
return new OptMongo(mongoDbFactory, converter);
}
Mongodb可视化工具
平常开发过程中为了提高效率,通常使用可视化工具进行相关操作
这里推荐两个可视化工具:
官方自带的Compass:
https://www.mongodb.com/download-center?initial=true#compass
robo3t:
https://robomongo.org/
ok 可以敬请玩耍了.