翻译或纠错本页面

FAQ: MongoDB基础知识

MongoDB数据库用:term:集合 collections <collection> 来组织文档,类似于关系型数据库的表。一个集合内可以有一个或多个:term:文档 documents <document>。文档的概念类似于关系型数据库的一个行,但是有更完整的信息。每个文档有多个字段,一个字段和关系型的一个列类似。

集合和RDBMS的表很不相同。一个集合内的文档可能会有不同的字段和结构。你可以只对某些文档增加一个字段,而不是所有的文档。

For the list of supported platforms, see 支持平台.

How does a collection differ from a table?

MongoDB使用动态模式。你可以建立一个没有预定义模式的集合。你可以通过直接在文档内增加或删除字段的方式修改文档的结构。文档在一个集合内不需要有相同的字段集。

参见

在实际使用中,一般一个集合内的数据多半会有相同或者类似的结构。但是这个不是一个必要的条件。MongoDB灵活的数据模式意味着模式转换和修改非常简单。你很少需要写个脚本来执行 “alter table”类型的DDL操作。这一点对于敏捷式开发有非常好的帮助。

How do I create a database and a collection?

MongoDB支持几乎所有常用的编程语言。参见:ecosystem:latest list of drivers </drivers>

If a collection does not exist, MongoDB creates the collection when you first store data for that collection. [1]

As such, you can switch to a non-existent database (use <dbname>) and perform the following operation:

use myNewDB

db.myNewCollection1.insert( { x: 1 } )
db.myNewCollection2.createIndex( { a: 1 } )

The insert operation creates both the database myNewDB and the collection myNewCollection1 if they do not already exist.

The createIndex operation, which occurs after the myNewDB has been created, creates the index and the collection myNewCollection2 if the collection does not exist. If myNewDb did not exist, the createIndex operation would have also created the myNewDB.

[1]You can also create a collection explicitly using db.createCollection if you want to specify specific options, such as maximum size or document validation rules.

How do I define or alter the collection schema?

MongoDB的定位是一种通用型数据库,它可以使用在很多应用场景下面。如内容管理,移动应用,游戏,电商,分析,存档和日志等等

MongoDB不适合那些需要使用SQL,关联和多文档事务的应用。

在 3.2 版更改: Starting in MongoDB 3.2, however, you can enforce document validation rules for a collection during update and insert operations.

举例来说,你可以把相关数据内嵌在一个文档的数组字段或者嵌套文档内,对这些数据的更新可以在一个原子操作内完成。在关系型数据库中同样的数据可能分布在不同的表和列内,在那样的情况下需要强事务支持来保证那些数据更新的原子性。

假如你没有发现你想要的答案,可以看一下这个页面: complete list of FAQs 或者把你问题发布到 MongoDB User Mailing List.

MongoDB允许客户端读取落盘之前文档的修改,不管你的写安全机制和恢复日志设置如何。正因如此,应用程序可能会观察到两种不同的行为:

参见

MongoDB需要很多内存么?

Does MongoDB support transactions?

MongoDB是一个文档型的数据库。和MySQL类似但是用JSON作为数据模型,而不是关系型表。MongoDB不支持关联或者强事务。但是MongoDB支持二级索引,丰富的查询语法,在文档级别有原子性写操作,读操作有很好的一致性。

在部署方面,MongoDB支持Master-Slave的复制方式,支持自动failover和以分布数据方式进行水平扩展。

MongoDB使用BSON,一种和JSON类似但是比JSON更高效的二进制对象格式,作为存储方式。

不一定。MongoDB可以在一个内存较小的机器上运行。

MongoDB 会使用系统所有可用内存作为它的缓存。 系统监控会显示MongoDB使用很多内存,但是这些内存的使用是动态的。如果另外一个进程突然需要服务器一半的内存,MongoDB会把内存让给其他进程。

从技术上来说,操作系统的虚拟内存管理模块负责管理MongoDB的内存使用。这意味着MongoDB可以用到系统所有的可用内存,并在必要的时候会使用交换内存。部署的时候尽量要使用足够的内存来装下工作集数据(热数据)。

FAQ:MogoDB 诊断 更多关于MongoDB内存使用的问题。

BSON

MongoDB 不支持配置缓存。MongoDB会通过内存映射的技术使用所有可用内存。这一点和操作系统处理文件系统缓存原理是一致的。

在MongoDB里面是否需要为应用程序缓存单独加一个缓存层?

BSONObj my_query = BSON( "name" << a_name );
auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", my_query);

不需要。在MongoDB里面,一个文档的结构和其在应用程序内存里的结构是相似的。这意味着数据库里存储的已经是一种可以直接使用的格式。这样在应用程序端就不再需要一个单独的缓冲层。

JavaScript

注解

是的。MongoDB会把最近所用的数据保持在内存里。如果你的索引数据和你的工作集数据小于内存的大小,那么MongoDB就可以从内存里直接处理你的查询。

MongoDB 没有查询缓存。MongoDB会直接从索引和数据文件里读取数据来处理查询请求。

  • $where
  • 虽然日志落盘几乎是实时的,但是MongoDB的数据落盘是异步的。MongoDB有可能会等到60秒才把数据写入数据文件。这个不影响数据持久性,因为日志里面有足够的信息用来做宕机时候的恢复动作。数据落盘间隔可以通过 syncPeriodSecs 设置来调整

  • group

You must exercise care in these cases to prevent users from submitting malicious JavaScript.

Fortunately, you can express most queries in MongoDB without JavaScript and for queries that require JavaScript, you can mix JavaScript and non-JavaScript in a single query. Place all the user-supplied fields directly in a BSON field and pass JavaScript code to the $where field.

If you need to pass user-supplied values in a $where clause, you may escape these values with the CodeWScope mechanism. When you set user-submitted values as variables in the scope document, you can avoid evaluating them on the database server.

←   常见问题 FAQ:索引  →