Mongodb是一个数据库服务器:它运行在前台或者后台,等待来自用户的连接。当你启动mongodb,你会看到类似于下面的内容:
~/$ ./mongod
#
# some logging output
#
Tue Mar 9 11:15:43 waiting for connections on port 27017
Tue Mar 9 11:15:43 web admin interface listening on port 28017
此时它会停止打印输出但是并没有冻结,它只是监听在端口27017等待连接。一旦你连接并开始发送命令,它会继续输出所作事情的log。你可以使用任何一个mongodb驱动或者mongo shell去连接到数据库。
你不能通过在网页浏览器上输入http://localhost:27017来连接到mongodb。数据库不能在端口27017上面使用HTTP访问。
标准的连接字符串格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- mongodb:// 必选的前缀,用来标示这是一个标准连接格式的字符串
- username:password@ 可选的。如果有,驱动在连接到数据库服务器后会尝试登录到一个数据库。
- host1 URL的必选部分。它标示了要连接的服务器地址。
- :portX 是可选的。如果没有提供默认连接到:27017.
- /database 要登录的数据库的名称,只有username:password@语法使用后它才有用。如果没有提供,默认使用“admin”。
- ?options 是连接的可选项。注意如果database没有提供,在最后一个主机和?符号中间依然需要一个斜杠"/"。可选项是名称=值的配对,他们使用"&"或者";"隔开。
很多主机可能需要指定(连接到复制对/组)。
这些可选项是:
复制组:
- replicaSet=name
- 驱动会检查连接到的复制组和这个名称是否匹配。意味着如果给出的主机是种子列表,驱动会尝试找到复制组内所有成员。
单台服务器:
- slaveOk=true|false
任何配置下:
- safe=true|false
- true:驱动在执行更新操作后会发送一个getLastError命令确保更新成功(同时查看一下w和wtimeoutMS)。
- false:驱动在每次更新操作后不会发送getLastError命令。
- w=n
- 驱动在getLastError命令中增加{w:n}。意味着safe=true.
- wtimeoutMS=ms
- 驱动在getLastError命令中增加{wtimeout:ms}。意味着safe=true.
- fsync=true|false
- true:驱动在getLastError命令中增加{fsync:true}。意味着safe=true.
- false:驱动不在getLastError命令中增加同步参数。
- journal=true|false
- 同步到日志文件。意味着fase=true.
- connectTimeoutMS=ms
- 一个连接在超时之前可以保持打开的时间。
- socketTimeoutMS=ms
- 套接字上面的发送和接收操作的超时时间。
这些可选项对大小写不敏感。
一些例子
连接到运行在本机监听默认端口的数据库服务器:
mongodb://localhost
使用用户名“fred”和密码“foobar”连接并登陆到管理数据库:
mongodb://fred:foobar@localhost
使用用户名“fred”和密码“foobar”连接并登陆到“baz”数据库:
mongodb://fred:foobar@localhost/baz
连接到一个复制配对,其中一台服务器在example1.com另一台服务器在example2.com:
mongodb://example1.com:27017,example2.com:27017
连接到一个复制组,三台服务器运行在本地(端口为27017,27018,27019):
mongodb://localhost,localhost:27018,localhost:27019
连接到一个三台服务器组成的复制组,将所有写操作发送给主节点,分发所有读操作到从节点:
mongodb://host1,host2,host3/?slaveOk=true
使用安全模式连接到本机:
mongodb://localhost/?safe=true
使用安全模式连接到复制组,等待复制操作至少在2台机器完成,2秒超时:
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
连接池
服务器会为每一个TCP连接启动一个线程,强烈推荐你的应用程序使用某种类型的连接池。幸运的是,大部分驱动的都为你实现了这个功能。当你的应用程序为每个请求启动一个进程时,驱动会抛出一个重要的异常,比如在CGI和一些PHP的配置中。