在本页面
本文档回答了有关MongoDB的一些常见问题。
是。MongoDB Atlas是一种云托管的数据库即服务。有关更多信息,请访问MongoDB Atlas。
MongoDB数据库将数据存储在collections中,而不是表 。集合包含一个或多个 BSON文档。文档类似于关系数据库表中的记录或行。每个文档都有 一个或多个字段;字段类似于关系数据库表中的列。
也可以看看
如果数据库不存在,则在您第一次为该数据库存储数据时,MongoDB会创建该数据库。
如果不存在集合,则在您第一次为该集合存储数据时,MongoDB会创建该集合。[1]
这样,您可以切换到不存在的数据库()并执行以下操作:use <dbname>
该insert
操作将同时创建数据库myNewDB
和集合(myNewCollection1
如果它们尚不存在)。
创建集合createIndex
后发生的操作将myNewDB
创建索引和集合(myNewCollection2
如果集合不存在)。如果myNewDb
不存在,则该
createIndex
操作还将创建myNewDB
。
[1] | db.createCollection 如果要指定特定选项(例如最大大小或文档验证规则),也可以使用显式创建集合
。 |
您无需在MongoDB中为集合指定架构。尽管集合中的文档通常具有很大程度上相同的结构,但这不是必需的;也就是说,单个集合中的文档不需要具有相同的字段集。字段的数据类型在集合中的文档之间也可能不同。
要更改集合中文档的结构,请将文档更新为新结构。例如,添加新字段,删除现有字段或将字段值更新为新类型。
在版本3.2中进行了更改:但是,从MongoDB 3.2开始,您可以在更新和插入操作期间对集合强制执行文档验证规则。
可以在显式创建集合时指定某些集合属性,例如指定最大大小,然后对其进行修改。请参阅db.createCollection
和collMod
。如果未指定这些属性,则无需显式创建集合,因为在首次存储集合数据时,MongoDB会创建新集合。
不直接,不。但是,MongoDB确实支持自己的丰富查询语言。有关使用MongoDB查询语言的示例,请参阅 MongoDB CRUD操作
您还可以使用MongoDB Connector for BI通过SQL查询MongoDB集合。
如果您正在考虑将SQL应用程序迁移到MongoDB,请下载《MongoDB应用程序现代化指南》以获取最佳实践迁移指南,参考架构和其他有用的资源。
也可以看看
因为单个文档可以包含相关数据,否则它们将在关系模式中的各个父子表之间建模,因此MongoDB的原子单文档操作已经提供了满足大多数应用程序数据完整性需求的事务语义。一个或多个字段可以通过一次操作编写,包括对多个子文档和数组元素的更新。MongoDB提供的保证可确保在文档更新时完全隔离。任何错误都会导致操作回滚,以使客户端获得一致的文档视图。
但是,对于需要对多个文档(在单个或多个集合中)进行读写原子性的情况,MongoDB支持多文档事务:
在版本4.0中,MongoDB支持副本集上的多文档事务。
在4.2版中,MongoDB引入了分布式事务,它增加了对分片群集上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。
有关MongoDB中事务的详细信息,请参阅 事务页面。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
是。MongoDB将最近使用的数据保留在RAM中。如果您为查询创建了索引,并且您的工作数据集适合RAM,那么MongoDB将从内存中提供所有查询。
MongoDB不会缓存查询结果以返回相同查询的缓存结果。
有关MongoDB和内存使用的更多信息,请参阅WiredTiger和内存使用。
客户端程序在MongoDB中组装查询时,将构建BSON对象而不是字符串。因此,传统的SQL注入攻击不是问题。更多细节和一些细微差别将在下面介绍。
MongoDB将查询表示为BSON对象。通常, 客户端库提供了一个方便,无注入的过程来构建这些对象。考虑下面的C ++示例:
在这里,my_query
将有一个诸如的值。如果包含特殊字符(例如
,和),则查询将根本不匹配任何文档。例如,用户无法劫持查询并将其转换为删除。{ name : "Joe"
}
my_query
,
:
{
注意
您可以通过--noscripting
在命令行上传递选项或security.javascriptEnabled
在配置文件中进行设置来禁用所有服务器端JavaScript的执行
。
以下所有MongoDB操作都允许您直接在服务器上运行任意JavaScript表达式:
在这些情况下,您必须格外小心,以防止用户提交恶意JavaScript。
幸运的是,您可以在不使用JavaScript的MongoDB中表达大多数查询,对于需要JavaScript的查询,可以在单个查询中混合使用JavaScript和非JavaScript。将所有用户提供的字段直接放在BSON字段中,并将JavaScript代码传递给该$where
字段。
如果需要在$where
子句中传递用户提供的值,则可以使用该CodeWScope
机制来转义这些值。在范围文档中将用户提交的值设置为变量时,可以避免在数据库服务器上评估它们。