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
- 建立資料庫
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)
其中一條資料:
{
"_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視覺化工具
ok 可以敬請玩耍了.