1. 程式人生 > >Mongodb基本操作手冊

Mongodb基本操作手冊

1. 執行Mongodb

連線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)

其中一條資料:

{
    "_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視覺化工具

ok 可以敬請玩耍了.