Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372556
  • 博文数量: 55
  • 博客积分: 3195
  • 博客等级: 中校
  • 技术积分: 712
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 18:45
文章分类

全部博文(55)

文章存档

2011年(14)

2010年(41)

分类: 数据库开发技术

2011-04-28 13:50:37

1. 下载预编译的二进制

选择32bit和64bit

建议使用64位版本的Windows运行64位版本的MongoDB。

解压后可以把目录更名为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版本。

详见

 

6. SQL与MongoDB的对照表

MongoDB拥有与关系型数据库(例如MySQL)相似的查询能力,但查询语法不同。

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()

更详细的用法见手册

 

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                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 ..."

参考

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列表见

阅读(1468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~