1、MongoDB Shell Script
mongoDB的命令行使用的是類似JavaScript腳本的命令行交互,所以我們可以在shell當中使用JS的一些命令、函數等。
輸入mongo命令啓動mongo控制檯
然後參考官方文檔操作mongo數據。
常用命令有
show dbs
use db-name
show collections
db.collection.find()
db.collection.findOne()
db.collection.remove(args)
db.collection.insert(args)
等。CURD操作可以參考官方文檔。
如果要生成大量測試數據,我們可以在mongo shell裏面寫一個for循環,
for (var i = 1; i <= 25; i++) db.testData.insert( { x : i } )
或者新建一個script.js將腳本放入循環內:
function insertData(dbName, colName, num) {
var col = db.getSiblingDB(dbName).getCollection(colName);
for (i = 0; i < num; i++) {
col.insert({x:i});
}
print(col.count());
}
如何運行這個函數呢?有兩種方法:
1、將其放入"~/.mongorc.js"這個文件內
2、將其保存爲script.js,然後運行mongo控制檯時輸入如下命令,會得到後臺執行:
mongo SERVER:PORT/dbname --quiet script.js
mongo控制檯啓動命令還有好多參數,可以參考官方文檔。
2、利用MongoDB JAR包編寫Java代碼訪問Mongo數據庫
下載MongoDB Java Driver:點擊打開鏈接
添加進Java Project內。具體API文檔可以點擊這裏。
Small Task
下面以一個任務爲例說明用法。
任務描述:定時刪除三個月前的article。其中每個article與一個聚類相關聯,同時數據庫中還有聚類(cluster)的數據信息。每次刪除article完成後,刪除對應的那些無任何文章關聯的聚類。
數據類型如下:
{ "_id" : ObjectId("52df7de966f0bc5d1bf4497d"), "clusterId" : 21, "docId" : 2, "title" : "test article 1", "type" : "article" }
任務分析:
1、首先需要依據條件查詢到符合“三個月前的”文章數據;
2、提取所有article的id構建成一個列表;
3、提取所有涉及到的cluster的id構建成一個沒有重複元素的列表;
4、刪除所有滿足條件的article;
5、判斷每個cluster是否已經爲空,若是則進行刪除聚類操作。
Java代碼如下:
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashSet;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.QueryBuilder;
public class MongoMainTest {
static int today = 0;
static int threeMonth = 0;
static DBObject documentFields = new BasicDBObject();
static DBObject clusterFields = new BasicDBObject();
static { //此處鍵值設爲true即代表作爲返回結果鍵值 返回
documentFields.put("_id", true);
documentFields.put("docId", true);
documentFields.put("clusterId", true);
documentFields.put("type", true);
clusterFields.put("clusterId", true);
clusterFields.put("type", true);
} // DBCursor cursor = instanceDB.find(new BasicDBObject("assign", vouch),DocumentFields);
/**
* @param args
*/
public static void main(String[] args) {
Mongo m = null;
try {
m = new Mongo( "10.211.55.7" , 27017 );
} catch (UnknownHostException e) {
e.printStackTrace();
System.exit(0);
}
DB db = m.getDB("clusterDb");
// List<String> dbs = m.getDatabaseNames();
// System.out.println(dbs);
// DBCollection coll = db.getCollection("rkCol");
// BasicDBObject doc = new BasicDBObject("docId",2); //此處爲書寫查詢方法一
// DBCursor curs = coll.find(doc);
// DBObject obj = (DBObject)JSON.parse("{docId: 2}"); //書寫查詢方法二
// curs = coll.find(obj);
// while(curs.hasNext()) {
// System.out.println("Cursor Count: "+curs.count());
// System.out.println(curs.next());
// }
DBCollection coll = db.getCollection("rkCol");
QueryBuilder queryBuilder = new QueryBuilder();
DBObject articleQuery = new BasicDBObject("type", "article")//;
.append("timestamp", new BasicDBObject("$lt", today-threeMonth))
.append("clusterId", true); //書寫查詢方法三
queryBuilder.and(articleQuery); //書寫查詢方法四
DBCursor curs = coll.find(queryBuilder.get()); //注意方法四在實際使用時需要調用get方法生成具體query語句
ArrayList<Object> articles = new ArrayList<Object>(); //此處element類型均爲Object
HashSet<Object> clusters = new HashSet<Object>();
DBObject article = null;
while(curs.hasNext()) {
article = curs.next();
articles.add(article.get("_id"));
clusters.add(article.get("clusterId"));
}
QueryBuilder removeBuilder = new QueryBuilder();
//注意下句使用了$in操作符,類似於{_id: articleID1} or {_id: articleID2} or {_id: articleID3} ...
DBObject removeObject = new BasicDBObject("_id", new BasicDBObject("$in", articles));
removeBuilder.and(removeObject);
/*打印結果*/
coll.remove(removeBuilder.get());
DBObject articleCountQuery = null;
for(Object o: clusters) {
articleCountQuery = new BasicDBObject("clusterId", o);
curs = coll.find(articleCountQuery);
if(curs.count() != 0) {
clusters.remove(o);
}
}
removeObject = new BasicDBObject("clusterId", new BasicDBObject("$in", clusters));
removeBuilder.and(removeObject);
coll.remove(removeBuilder.get());
/**
curs = coll.find(removeBuilder.get());
articles = new ArrayList<Object>();
clusters = new HashSet<Object>();
article = null;
while(curs.hasNext()) {
article = curs.next();
articles.add(article.get("_id"));
clusters.add(article.get("clusterId"));
}
/**/
System.out.println(articles);
System.out.println(clusters);
}
}
定時操作,參考這篇博文,利用Java代碼編程實現(利用開源庫Quartz)。
Linux的環境可以使用crontab工具,更爲簡單方便。此處所需要配合使用的JS代碼簡略。