Mongodb基本操作手册

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

  1. 创建数据库
use DATABASE_NAME 

如果数据库不存在,则创建数据库,否则切换到指定数据库。

  1. 显示数据库
show dbs
  1. 显示当前连接的数据库
db
  1. 删除数据库
db.dropDatabase()

删除成功结果:

{ "dropped" : "dbtest", "ok" : 1 }

在当前所选的数据库下,执行,即可删除其数据库。

  1. 删除集合
db.COLLECTION.drop()
  1. 插入文档
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']
})
  1. 更新文档

语法

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 })
  1. 保存文档

语法

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

document : 文档数据。
writeConcern :可选,抛出异常的级别。

  1. 删除文档
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{()}
  1. 查询文档
    (需要先到对应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:limitSkip可用于分页

  • 排序
    语法
db.COLLECTION.find().sort({KEY:1})

sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。

  1. 索引
    使用ensureIndex()方法创建索引
    语法
db.COLLECTION.ensureIndex({KEY:1})

语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。

在后台创建索引:

db.values.ensureIndex({open: 1, close: 1}, {background: true})

通过在创建索引时加background:true 的选项,让创建工作在后台执行

  1. 聚合

聚合(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);
  1. 复制(副本级)

MongoDB复制是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

复制还允许您从硬件故障和服务中断中恢复数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。

  1. 分片
    在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
    过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

  2. 备份与恢复
    在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:
指定备份的目录

你不能同时指定 和 --dir 选项。
在这里插入图片描述
16. MongoDB监控
MongoDB中提供了 mongostatmongotop两个命令来监控MongoDB的运行情况。
mongostatmongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取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 可以敬请玩耍了.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值