FAQ: MongoDB基础知识
在本页面
本文档回答了有关MongoDB的一些常见问题。
MongoDB数据库将数据存储在集合collections中,而不是表table。集合包含一个或多个 BSON文档。文档类似于关系数据库表中的记录或行。每个文档都有 一个或多个字段;字段类似于关系数据库表中的列。
也可以看看
如果数据库不存在,MongoDB会在您第一次为该数据库存储数据时创建该数据库。
因此,您可以切换到一个不存在的数据库 (
use
) 并执行以下操作:复制
use myNewDB
db.myNewCollection1.insertOne( { x: 1 } )
db.myNewCollection2.createIndex( { a: 1 } )
如果数据库
myNewDB
和集合myNewCollection1
尚不存在,insert
操作将同时创建它们。发生在
myNewDB
库创建之后的createIndex
操作,将创建索引,并且如果集合不存在的话也会创建myNewCollection2
集合。如果myNewDb
不存在,则该 createIndex
操作还将创建myNewDB
。 | |
在MongoDB中您无需为集合指定模式。尽管集合中的文档通常具有很大程度上相同的结构,但这不是必需的;也就是说,单个集合中的文档不需要具有相同的字段集。字段的数据类型在集合中的文档之间也可能不同。
要更改集合中文档的结构,请将文档更新为新结构。例如,添加新字段,删除现有字段或将字段值更新为新类型。
可以在显式创建集合时指定某些集合属性,例如指定最大大小,然后对其进行修改。请参阅
db.createCollection
和collMod
。如果未指定这些属性,则无需显式创建集合,因为在首次存储集合的数据时,MongoDB会创建新的集合。也可以看看
由于单个文档可以包含相关数据,否则这些相关数据将在关系模式中的各个父子表之间建模,因此MongoDB的原子单文档操作已经提供了满足大多数应用程序数据完整性需求的事务语义。可以在单个操作中写入一个或多个字段,包括对多个子文档和数组元素的更新。MongoDB提供的保证可确保在文档更新时完全隔离。任何错误都会导致操作回滚,以使客户端获得一致的文档视图。
但是,对于需要对多个文档(在单个或多个集合中)进行读写原子性的情况,MongoDB支持多文档事务:
- 在版本4.0中,MongoDB支持副本集上的多文档事务。
- 在版本4.2中,MongoDB引入了分布式事务,它增加了对分片群集上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替高效的模式设计。对于许多应用场景, 非规范化数据模型(嵌入式文档和数组)将继续为您的数据和用例的最佳选择。也就是说,对于许多场景,对数据进行适当的建模将最大程度地减少对多文档事务的需求。
是的。MongoDB将最近使用的数据保留在RAM中。如果您为查询创建了索引,并且您的工作数据集适合RAM,那么MongoDB将从内存中进行所有查询。
MongoDB不缓存查询结果,以便为相同查询返回缓存结果。
当客户端程序在MongoDB中组合查询时,将构建BSON对象而不是字符串。因此,传统的SQL注入攻击并不是问题。更多细节和一些细微差别将在下面介绍。
复制
BSONObj my_query = BSON( "name" << a_name );
auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", my_query);
示例中,
my_query
将有一个诸如{ name : "Joe" }
的值。如果my_query
包含特殊字符,例如,,
,:
和{
,查询将不匹配任何文档。例如,用户无法劫持查询并将其转换为删除。注意
以下所有MongoDB操作都允许您直接在服务器上运行任意JavaScript表达式:
在这些情况下,您必须格外小心,以防止用户提交恶意JavaScript。
译者:钟秋
update:小芒果
最近更新 1yr ago