常见问题解答:MongoDB 基础知识
本页内容
本文档回答了关于 MongoDB 的一些常见问题。
MongoDB 支持哪些平台?
有关支持平台的列表,请参阅平台支持.
MongoDB是否提供托管服务?
是的。MongoDB Atlas 是一种云托管数据库即服务。有关更多信息,请访问 MongoDB Atlas。
集合与表有何不同?
与表不同,MongoDB数据库将其数据存储在 集合 中。一个集合包含一个或多个 BSON 文档。文档类似于关系型数据库表中的记录或行。每个文档都有一个或多个 字段;字段类似于关系型数据库表中的列。
我如何创建数据库和集合?
注意
您可以通过使用以下链接中的命令来输入本FAQ中引用的命令:MongoDB Shell
。MongoDB Shell 是 MongoDB 的交互式 JavaScript 接口。您可以使用 MongoDB Shell 查询和更新数据,以及执行管理操作。
如果数据库不存在,MongoDB 会在新存储该数据库的数据时创建该数据库。
如果集合不存在,MongoDB 会在新存储该集合的数据时创建该集合。
因此,您可以将数据库切换到不存在的数据库(use <dbname>
)并执行以下操作
use myNewDB; db.myNewCollection1.insertOne( { x: 1 } ); db.myNewCollection2.createIndex( { a: 1 } );
db.collection.insertOne()
方法如果集合myNewCollection1
不存在,则会创建该集合。db.collection.createIndex()
方法如果集合myNewCollection2
不存在,则会创建索引和该集合。如果数据库
myNewDb
不存在,则db.collection.createIndex()
方法或db.collection.insertOne()
方法会自动创建myNewDb
数据库。
如果您想指定特定选项,如最大大小或文档验证规则,您也可以使用 db.createCollection()
方法显式创建集合
use myNewDB; db.createCollection("myNewCollection1");
如何定义或修改集合模式?
在MongoDB中,您无需为集合指定模式。尽管集合中的文档通常具有大致相同的结构,但这不是必须的;也就是说,单个集合中的文档不需要具有相同的字段集。字段的数据类型也可以在集合中的不同文档中有所不同。
要更改集合中文档的结构,请将文档更新为新结构。例如,添加新字段、删除现有字段或更新字段的值到一个新类型。
注意
您可以在更新和插入操作期间对集合强制执行文档验证规则。
某些集合属性,如指定最大大小,可以在显式创建集合时指定并进行修改。请参阅db.createCollection()
和collMod
。如果您没有指定这些属性,由于MongoDB在您首次为集合存储数据时会创建新集合,因此您不需要显式创建集合。
MongoDB支持SQL吗?
不支持。然而,MongoDB支持自己丰富的查询语言。有关使用MongoDB查询语言的示例,请参阅MongoDB CRUD操作。
您还可以使用MongoDB BI连接器使用SQL查询MongoDB集合。
如果您正在考虑将SQL应用程序迁移到MongoDB,请下载MongoDB应用程序现代化指南以获取最佳实践迁移指南、参考模式和其他有用资源。
MongoDB支持事务吗?
由于单个文档可以包含在其他关系数据库模式中分布在父-子表中的相关数据,MongoDB的原子单文档操作已经提供了满足大多数应用程序数据完整性需求的事务语义。一次操作可以写入一个或多个字段,包括多个子文档和数组的元素。MongoDB提供的保证确保在更新文档时具有完全的隔离性;任何错误都会导致操作回滚,从而使客户端能够接收到文档的一致视图。
对于需要读取和写入多个文档的原子性(在单个或多个集合中)的情况,MongoDB支持分布式事务,包括副本集和分片集群的事务。
有关更多信息,请参阅事务。
重要
在大多数情况下,分布式事务相对于单文档写入会带来更高的性能成本,因此分布式事务的可用性不应取代有效的模式设计。对于许多场景,非规范化数据模型(嵌入文档和数组)将继续是您数据和用例的最佳选择。也就是说,在许多情况下,适当地建模您的数据将最大限度地减少分布式事务的需求。
有关其他事务使用考虑事项(例如运行时限制和oplog大小限制),请参阅生产注意事项。
MongoDB处理缓存吗?
是的。MongoDB将最近使用的数据存储在RAM中。如果您已为查询创建了索引,并且您的工作数据集适合在RAM中,MongoDB将从内存中处理所有查询。
MongoDB不会缓存查询结果,以便为相同的查询返回缓存的结果。
有关MongoDB和内存使用的信息,请参阅WiredTiger和内存使用。
MongoDB如何解决SQL或查询注入?
BSON
当客户端程序在MongoDB中构建查询时,它会构建一个BSON对象,而不是字符串。因此,传统的SQL注入攻击不会成为问题。下面将详细介绍一些细节和细微差别。
MongoDB将查询表示为BSON对象。通常,客户端库提供了一种方便的、无注入的过程来构建这些对象。以下是一个C++示例
BSONObj my_query = BSON( "name" << a_name ); auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", my_query);
在这里,my_query
的值将类似于{ name : "Joe" }
。如果my_query
包含特殊字符,例如,
、:
和{
,查询将简单地无法匹配任何文档。例如,用户无法劫持查询并将其转换为删除。
JavaScript
注意
您可以通过命令行传递--noscripting
选项或在配置文件中将security.javascriptEnabled
设置为false来禁用所有服务器端JavaScript执行。
对于
mongod
实例,通过命令行传递--noscripting
选项或在配置文件中将security.javascriptEnabled
设置为false。对于
mongos
实例,通过命令行传递--noscripting
选项或在配置文件中将security.javascriptEnabled
设置为false。
以下MongoDB操作允许您直接在服务器上运行任意JavaScript表达式
在这些情况下,您必须谨慎行事,以防止用户提交恶意JavaScript。
幸运的是,您可以在MongoDB中用JavaScript表达大多数操作。