`

MongoDB官方教程整理笔记(摘录)

阅读更多

声明:内容均为摘录,仅包括简单功能,请以官网最新中文教程为准

 

平台以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/

 

 

 

-------------------------------------------

20110311更新:

 

更多见豆瓣

http://www.douban.com/group/mongodb/

 

因为本人是MySQL爱好者&菜鸟,所以暂时不够级别研究这个,

官网有完整的中文翻译文档,还提供快速参考卡片

http://www.10gen.com/reference

点进去按“Skip Form”跳过即可下载,

不过现在貌似没有中文版。

 

(怨念:为什么用JavaScript不用Lua的说~)

 

--------------------------------------------

 

20110312更新:

中文pdf见

http://www.10gen.com/conferences/mongobeijing2011

下面会议日程安排里的Slides链接

 

---------------------------------------------

20110317更新:

更改一个失效的链接

 

 

 

分享到:
评论

相关推荐

    Spring初学者入门教程 PDF带书签高清版

    高清的版面设计确保了阅读体验,同时支持文字复制,方便学习者摘录和笔记。 在“Spring-rumen_jb51”这个压缩包文件中,可能会包含以下内容: 1. **Spring概述**:讲解Spring框架的起源、发展以及其在现代Java应用...

    图书收藏系统

    3. 数据库:MySQL或MongoDB等数据库管理系统用于存储图书信息、用户数据和阅读笔记,确保数据的安全性和完整性。 4. 云服务:通过AWS、阿里云等云服务提供商,实现数据备份、负载均衡和弹性伸缩,保障系统的高可用...

    简单的微博

    4. "jb51.net.txt" - jb51.net是一个技术分享网站,此文件可能是从该网站上摘录的代码片段或教程,帮助开发者解决特定问题,如优化性能、解决兼容性问题等。 综合以上信息,构建“简单的微博”涉及了Web开发的多个...

    维护:在ubuntu20.04上的生活

    笔记本-读书笔记 资源-学习资源 目录和文件 目录和文件说明 [dir] ..... code-代码目录[目录] ..........Python[dir] ...... network-programming-网络编程[dir] ............... regexp-正则[dir] ......摘录-代码...

    lyf暑假bookManager

    3. **书评与笔记**:提供平台让用户记录对书籍的感想、摘录或做笔记。 4. **搜索与分类**:方便用户按关键词、作者或类别快速找到所需书籍。 5. **电子书管理**:如果包含电子书功能,可能支持导入、存储和阅读...

    DailyReadingNote

    5. **数据库管理**:如MySQL、PostgreSQL或MongoDB等,用于存储用户的笔记数据,需要考虑数据的持久化、备份和恢复策略。 6. **版本控制**:可能使用Git进行代码版本管理,确保团队协作时的代码同步和冲突解决。 7...

    readings:关于计算机科学的有趣阅读和讲座

    计算机科学是21世纪最为重要的学科之一,它涵盖了...资源可能包括专家讲座的笔记、经典书籍的摘录、教程和案例研究,这些都是扩展知识和提升技能的有效途径。在计算机科学的世界里,不断学习和探索是永无止境的旅程。

Global site tag (gtag.js) - Google Analytics