Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
Ruby 驱动程序

数据库和集合

在本指南中,您可以学习;了解如何通过Ruby驾驶员使用MongoDB数据库和集合。

MongoDB 将数据组织成以下级别的层次结构:

  • 数据库:MongoDB 实例中数据组织的顶层。

  • 集合:MongoDB 将文档存储在集合中。 它们类似于关系数据库中的表。

  • 文档:包含字面数据,例如string 、数字、日期和其他嵌入式文档。

有关文档字段类型和结构的更多信息,请参阅 MongoDB Server 手册中的文档指南。

通过创建具有所需数据库名称的 Mongo::Client实例来访问数据库。

以下示例将访问名为test_database的数据库:

client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test_database')
database = client.database

在数据库实例上使用 [] 方法访问集合。

以下示例访问名为 test_collection 的集合:

database = client.database
collection = database['test_collection']

提示

如果提供的集合名称在数据库中尚不存在,则当您首次向其中插入数据时,MongoDB 会隐式创建该集合。

虽然MongoDB的Ruby驾驶员没有直接的 create_collection 方法,但您可以使用 create 方法创建具有特定选项的集合。

以下示例使用特定选项创建名为 example_collection 的集合:

database = client.database
database[:example_collection].create(capped: true, size: 1024)

您可以指定集合选项,例如最大大小、文档验证规则等,方法是将这些选项作为参数传递给使用 create 命令的命令方法。有关可选参数的完整列表,请参阅有关创建命令的MongoDB文档。

您可以通过调用 collections 方法查询数据库中的集合列表。此方法返回数据库中的集合对象大量。

以下示例调用 collections 方法并迭代大量以打印结果:

database = client.database
collection_list = database.collections
collection_list.each do |collection|
puts collection.name
end

要仅查询数据库中集合的名称,请调用collection_names方法,如下所示:

database = client.database
collection_names = database.collection_names
collection_names.each do |name|
puts name
end

注意

database.collections对象列表提供了更详细的信息(即可以进一步查询每个集合对象的元数据),而database.collection_names仅列出集合名称。

您可以使用drop方法从数据库中删除集合。

以下示例删除test_collection集合:

database = client.database
collection = database[:test_collection]
collection.drop

警告

删除集合会删除该集合中的所有数据

从数据库中删除集合会永久删除该集合中的所有文档和所有索引。

仅当不再需要集合中的数据时才删除集合。

您可以通过设置读取偏好来控制驱动程序路由读取操作的方式。 您还可以通过设置读关注写关注来控制驱动程序如何等待副本集上读写操作确认的选项。

默认情况下,数据库从Mongo::Client实例继承这些设置,集合从数据库继承这些设置。 但是,您可以使用以下方法之一更改数据库或集合的这些设置:

  • database.with:获取数据库并应用新的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。

  • collection.with:获取集合并应用新的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。

要使用上述方法更改读取或写入设置,请调用该方法并传入新的读取偏好(read preference)、读关注(read concern)或写关注(write concern)。

以下示例展示了如何使用 database.with 方法更改名为 test-database 的数据库的读取偏好(read preference)、读关注(read concern)和写入偏好:

database_with_settings = client.use('test_database').with(
read: { mode: :secondary },
read_concern: { level: :local },
write: { w: :majority }
)

以下示例展示了如何更改集合的读取偏好(read preference)、读关注(read concern)和写关注(write concern):

collection_with_settings = client[:test_collection].with(
read: { mode: :secondary },
read_concern: { level: :local },
write: { w: :majority }
)

要了解有关读取和写入设置的更多信息,请参阅 MongoDB Server 手册中的以下指南:

在MongoDB Server中,您可以根据您选择的任何条件将键值标签应用副本集成员。然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。

默认下, MongoDB Ruby驾驶员会选择主节点 (primary node in the replica set)节点进行读取操作。您可以通过设置读取偏好和标签集(可选)来修改此行为。

在以下代码示例中,传递给 :read 参数的标签集指示Ruby驾驶员优先从纽约数据中心('dc':'ny') 读取数据,并回退到旧金山数据中心('dc':'sf'):

client = Mongo::Client.new(['IP_ADDRESS_001:27017'], database: 'test', read: {
mode: :secondary,
tag_sets: [{'dc' => 'ny'}, {'dc' => 'sf'}]
})
database = client.database
collection = database[:example_collection]

要学习;了解有关副本集的更多信息,请参阅MongoDB Server手册副本集成员页面。

如果多个副本集成员与您指定的读取偏好(read preference)和标签集匹配,Ruby驾驶员将从分片的集群的最近副本集成员(根据其网络探测(ping)时间选择)读取。

默认情况下,驱动程序仅使用 ping 时间与最近节点的 ping 时间在15毫秒以内的节点进行查询。 要在延迟较高的成员之间分配读取,请将local_threshold选项传递给Mongo::Client构造函数。

以下示例指定了35毫秒的本地阈值:

client = Mongo::Client.new(
['IP_ADDRESS_001:27017'],
database: 'test_database',
read: { mode: :secondary_preferred },
local_threshold: 35
)
database = client.database
collection = database[:example_collection]
result = collection.find({}).first
puts result

在前面的示例中, Ruby驾驶员在最近成员的网络探测(ping)时间差的 35 毫秒内在匹配成员之间分配读取。

注意

通过 mongos实例与副本集通信时, Ruby驾驶员会忽略 local_threshold 的值。在这种情况下,请使用 localThreshold 命令行选项。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

AWS Lambda

在此页面上