平台以win32為例,內容均來自官網,略加整理。
參考:
http://wiki.mongodb.org/display/DOCS/Quickstart+Windows
http://www.mongodb.org/display/DOCS/Tutorial
中文文檔:
http://wiki.mongodb.org/display/DOCS/Home
下面的Translations的“中文”連結
1. 下載先行編譯的二進位
選擇32bit和64bit
建議使用64位版本的Windows運行64位版本的MongoDB。
http://wiki.mongodb.org/display/DOCS/Downloads
解壓後可以把目錄更名為mongo-xxxxxxx以表示區分
2. 建立資料目錄
Windows下預設的資料目錄儲存在MongoDB二進位所在盤中。
例如在C:/下的mongo都會儲存在C:/data/db,
不過它不會自動建立,必須手工建立
C:/> mkdir /data
C:/> mkdir /data/db
3. 運行MongoDB伺服器
最重要的二進位檔案是:資料庫伺服器mongod.exe和管理工具mongo.exe
假設在C:/my_mongo_dir/bin中,則執行以下命令啟動伺服器
C:/> cd /my_mongo_dir/bin
C:/my_mongo_dir/bin > mongod
如果要以服務的形式運行,則使用類似的命令列
mongod --bind_ip 127.0.0.1 --logpath d:/mongo/logs --logappend --dbpath d:/mongo/data --directoryperdb --install
其中
mongod --install
mongod --service
mongod --remove
mongod --reinstall
可以對服務執行添加和刪除操作。
--serviceName {arg}
--serviceUser {arg}
--servicePassword {arg}
設定服務的相關資訊
4. 用mongo.exe測試簡單JavaScript語句
C:/> cd /my_mongo_dir/bin
C:/my_mongo_dir/bin> mongo
> // the mongo shell is a javascript shell connected to the db
> 3+3
6
> db
test
> // the first write will create the db:
> db.foo.insert( { a : 1 } )
> db.foo.find()
{ _id : ..., a : 1 }
mongo.exe的詳細的用法可以參考mongo.exe --help
5. (可選)用VS編譯MongoDB的windows版本。
詳見
http://wiki.mongodb.org/display/DOCS/Building+for+Windows
6. SQL與MongoDB的對照表
MongoDB擁有與關係型資料庫(例如MySQL)相似的查詢能力,但查詢文法不同。
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart
MongoDB的請求(包括索引鍵樣式)以JSON (BSON)對象表達,
而且包含一個實際動詞(如find)。
以下是SQL與Mongo請求語言語句的對照(可以運行於管理命令列mongo.exe)
(註:不一定等效,某些操作在不同的資料庫有自己特有的規定,
例如MySQL,所以要格外小心)
(1) 建立
CREATE TABLE USERS (a Number, b Number)
(隱式,但也可以顯式建立,例如一個封頂集合)
> # mongo shell
> db.createCollection("mycoll", {capped:true, size:100000})
> show collections
如果驅動支援,還可以
> db.runCommand( {createCollection:"mycoll", capped:true, size:100000} )
(2) 插入
INSERT INTO USERS VALUES(1,1)
> db.users.insert({a:1,b:1})
(3) 查詢
SELECT a,b FROM users
> db.users.find({}, {a:1,b:1})
SELECT * FROM users
> db.users.find()
SELECT * FROM users WHERE age=33
> db.users.find({age:33})
SELECT a,b FROM users WHERE age=33
> db.users.find({age:33}, {a:1,b:1})
SELECT * FROM users WHERE age=33 ORDER BY name
> db.users.find({age:33}).sort({name:1})
SELECT * FROM users WHERE age>33
> db.users.find({'age':{$gt:33}})
> db.users.find({age:{$gt:33}})
SELECT * FROM users WHERE age<33
> db.users.find({'age':{$lt:33}})
> db.users.find({age:{$lt:33}})
SELECT * FROM users WHERE a=1 and b='q'
> db.users.find({a:1,b:'q'})
(4) 更新(20110311更新:包括刪除?)
UPDATE users SET a=1 WHERE b='q'
> db.users.update({b:'q'}, {$set:{a:1}}, false, true)
(5) 索引
CREATE INDEX myindexname ON users(name)
> db.users.ensureIndex({name:1})
EXPLAIN SELECT * FROM users WHERE z=3
> db.users.find({z:3}).explain()
(6) 集合函數,排序和分頁和其它查詢
SELECT * FROM users ORDER BY name DESC
> db.users.find().sort({name:-1})
SELECT * FROM users LIMIT 10 SKIP 20
> db.users.find().limit(10).skip(20)
SELECT * FROM users LIMIT 1
> db.users.findOne()
SELECT DISTINCT last_name FROM users
> db.users.distinct('last_name')
SELECT COUNT(*y) FROM users
> db.users.count()
SELECT COUNT(*y) FROM users where AGE > 30
> db.users.find({age: {'$gt': 30}}).count()
SELECT COUNT(AGE) from users
> db.users.find({age: {'$exists': true}}).count()
更詳細的用法見手冊
http://www.mongodb.org/display/DOCS/Manual
7. 用mongo.exe管理資料庫
雙擊運行mongo.exe
預設串連到localhost的test資料庫
MongoDB shell version: 1.6.3
connecting to: test
>
切換資料庫(可以是不存在的)
MongoDB不要求顯式建立資料庫的集,而是在插入資料時自動建立。
如果集合不存在,MongoDB會認為是空集合。
用use切換資料庫不會立刻建立資料庫,而是等到資料插入時才建立。
所以show dbs不會立刻顯示該資料庫
> use mydb
switched to db mydb
顯示所有資料庫
> show dbs
admin
local
test
查看協助:
> help
db.help() help on db methods
db.mycoll.help() help on collection methods
rs.help() help on replica set methods
help connect connecting to a db help
help admin administrative help
help misc misc things to know
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries wit
h time >= 1ms
use <db_name> set current database
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to f
urther iterate
exit quit the mongo shell
建立變數,賦值,儲存到集合中,然後讀出來。
隱含以下規則:
不需要建立集;
結構動態可變,而且允許異構的對象放在一起;
自動添加_id欄位;
ObjectID值是唯一的。
> j = { name : "mongo" };
{"name" : "mongo"}
> t = { x : 3 };
{ "x" : 3 }
> db.things.save(j);
> db.things.save(t);
> db.things.find();
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
迴圈插入,顯示時如果超過20條,顯示前20條,可用it繼續顯示
find()返回遊標對象
> for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i});
> db.things.find();
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }
has more
> it
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
可以顯式儲存遊標變數,然後操作(用內建的tojson()可以美化文檔)
> var cursor = db.things.find();
> while (cursor.hasNext()) printjson(cursor.next());
還可以使用forEach()執行迴圈(但需要定義一個專門的函數)
> db.things.find().forEach(printjson);
可以把遊標當作數組使用。
此時所有資料的載入到記憶體,對於大的結果集可能會導致記憶體溢出。
所以盡量以迭代器形式使用
> var cursor = db.things.find();
> printjson(cursor[4]);
可以轉換為數組(數組概念不適用於驅動,僅使用於互動介面)
> var arr = db.things.find().toArray();
> arr[5];
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
由於MongoDB的遊標是非快照的,
所以第一次和最後一次next()之間的操作可能影響也可能不影響查詢結果。
此時需要使用鎖住快照查詢。
MongoDB具有與SQL相似的查詢能力,
通常需要建立“查詢文檔”(即那個作為參數的大括弧JSON對象)
例如:
SELECT * FROM things WHERE name="mongo"
> db.things.find({name:"mongo"}).forEach(printjson);
SELECT * FROM things WHERE x=4
> db.things.find({x:4}).forEach(printjson);
{ a:A, b:B, ... }的意思是
where a==A and b==B and ..."
參考http://www.mongodb.org/display/DOCS/Queries+and+Cursors
MongoDB還允許返回“部分文檔”,方法是在find的第二個參數中指定文檔的元素子集。
注意_id欄位總是要返回
SELECT j FROM things WHERE x=4
> db.things.find({x:4}, {j:true}).forEach(printjson);
為方便處理遊標,mongo和驅動提供findOne()查詢文檔。
和find()參數一樣,但返回的不是遊標,而是滿足條件的第一個文檔或者null。
這種方法高效,使資料庫和用戶端的工作減少,
> printjson(db.things.findOne({name:"mongo"}));
等效於find({name:"mongo"}).limit(1)
可以用limit()限制結果的大小。
好處和findOne()一樣。
> db.things.find().limit(3);
如果想查詢方法名,可以用help()
> db.help()
> db.whatever.help()
如果忽略參數表,則輸出原始碼
> printjson
function (x) {
print(tojson(x));
}
由於mongo是完全的JavaScript外殼,所以支援任何JavaScript函數,文法和類。
另外還定義自己的類和全域變數(例如db),
API列表見
http://api.mongodb.org/js/