MongoDB預設將資料存放區在 /data/db 目錄下
ubuntu預設安裝在/usr/lib/mongodb下面
啟動服務
啟動MongoDB伺服器:
$sudo ./mongodb-路徑/bin/mongod
啟動shell,它預設串連到localhost:
$ sudo ./mongodb-路徑/bin/mongo >命令文法
停止服務
#!/bin/bashpid=`ps -o pid,command ax | grep mongod | awk '!/awk/ && !/grep/ {print $1}'`;if [ "${pid}" != "" ]; then kill -2 ${pid};fi
shell:
show dbs //所有的資料庫
show collections //當前資料庫的所有集合
show users //所有使用者
user <db name> //切換資料庫
db.help() //資料庫所有可操作命令
db.testcollection.help() //集合所有可操作命令
db.testcollection.find() //當前資料庫下的testcollection集合下的所有資料
db.testcollection.find({name:'larry'}) //尋找
db.testcollection.insert({name:'larry'}) //插入
db.testcollection.remove({name:'larry'}) //刪除
java api:
Mongo:連線物件
DB:資料庫
DBCollection:集合(類比關聯式資料庫中的表),可用於增刪改查對象
BasicDBObject:實現了DBObject,一條記錄。
DBCursor:遊標,用來遍曆查詢取得的資料,實現了Iterable和Iterator
getLastError()
mongodb預設不等待響應訊息。使用getLastError命令可以確保操作已經正確執行
寫操作預設不會有返結果:這樣就節約了用戶端在寫操作時等待用戶端/伺服器之間往返時間。
調用getLastError會阻塞串連一直到返回結果
java驅動使用WriteConcern配置返回結果的時機
傳回值
這個命令的傳回值是一個多欄位的對象。常用的欄位已經列在下面;這裡可能還有其他欄位。
- ok - 為真的話表示getLastError命令成功完成了。它並不表示上一次沒有錯誤。
- err - 如果非空,表示有錯誤出現。值是一個錯誤本文的描述。
- code - 如果設定了,表示出現的錯誤碼。
- connectionId - 串連的id。
- lastOp - 上一次操作的op-id
對於更新:
使用了w
- wnote - 如果設定了,表示這裡有些不尋常的事情發生,涉及使用w:
- wtimeout - 如果逾時了,設定該值為真
- waited - 如果逾時了,標記等到了多久,單位毫秒
- wtime - 花在等待操作完成的時間
串連資料庫
Mongo m = new Mongo("localhost");//預設使用27017連接埠
DB db = m.getDB("qa");//獲得名為qa的資料庫,沒有則建立
DBCollection question = db.getCollection("question"); //獲得名為students的集合,沒有則自動建立
m.getDatabaseNames();//查看所有資料庫
db.getCollectionNames();//當前資料庫下所有集合
m.dropDatabase("qa");//刪除一個資料庫
插入資料
BasicDBObject dbo = new BasicDBObject();
dbo.put("name", "larry");
question.insert(dbo);
question.save(dbo);
insert如果主鍵_id存在不做任何操作
save如果主鍵_id存在更新
查詢資料
//查詢所有對象 DBCursor cur = question.find(); while(cur.hasNext()){ System.out.println(cur.next()); } //第一個對象 question.findOne(); //查詢記錄數量 question.find().count(); //查詢部分資料區塊 cur = question.find().skip(0).limit(1); while(cur.hasNext()){ System.out.println(cur.next()); } //比較查詢 //"$gt": 大於 //"$gte":大於等於 //"$lt": 小於 //"$lte":小於等於 //"$in": 包含 cond = new BasicDBObject(); cond.put("age", new BasicDBObject("$gt",19)); cond.put("age",new BasicDBObject("$gt",19).append("$lt", 30)); cond.put("age",new BasicDBObject("$in",arr)); Pattern p = Pattern.compile("Ja?k"); cond.put("name", p); cur = question.find(cond); while(cur.hasNext()){ System.out.println(cur.next()); }
更新:
//如果資料不存在,是否添加
//匹配到多條是否修改
WriteConcern.NONE:沒有異常拋出WriteConcern.NORMAL:僅拋出網路錯誤異常,沒有伺服器錯誤異常
WriteConcern.SAFE:拋出網路錯誤異常、伺服器錯誤異常;並等待伺服器完成寫操作。
WriteConcern.MAJORITY: 拋出網路錯誤異常、伺服器錯誤異常;並等待一個主伺服器完成寫操作。
WriteConcern.FSYNC_SAFE: 拋出網路錯誤異常、伺服器錯誤異常;寫操作等待伺服器將資料重新整理到磁碟。
WriteConcern.JOURNAL_SAFE:拋出網路錯誤異常、伺服器錯誤異常;寫操作等待伺服器提交到磁碟的記錄檔。
WriteConcern.REPLICAS_SAFE:拋出網路錯誤異常、伺服器錯誤異常;等待至少2台伺服器完成寫操作
WriteResult ret = question.update(new BasicDBObject("name","larry"), new BasicDBObject("$set", new BasicDBObject("age",21,WriteConcern.NORMAL)),true,true,WriteConcern.SAFE);
ret.getN() //操作影響的記錄條數
ret.getLastError()//操作發生的異常
由於mongodb中使用串連池的原因,getLastError()需要再次從串連池中擷取串連,這樣效率會慢一些
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}, WriteConcern.SAFE);if(ret.getLastError() == null) return true;else return false;<==>db.requestStart();//保證使用同一個串連,串連中間不會被放回串連池WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}});if(ret.getLastError() == null) return true;else return false;db.requestDone();
刪除:
question.remove(cond);