MongoDB 基础知识






4.56/5 (6投票s)
本文演示了如何在您的计算机上设置 MongoDB 运行
引言
不久前,我听说过 MongoDb,并开始在搜索引擎上搜索以了解它的范围。我在各种网站和书籍上发现了大量零散的资料。然后,我想至少整理一份关于 MongoDB 的基本入门教程,以便新接触 MongoDB 或不熟悉它的开发者能够了解它是什么,以及如何开始使用这项新技术进行开发。
我必须在此提到,本文很大程度上受到 Karl Seguin 关于 MongoDB 的书籍的启发。他的博客可以在 这里 找到。
本文介绍了 MongoDB,一种 NoSQL 的、面向文档的数据库。对于不熟悉 NoSQL 数据库的开发者来说,会想知道它是如何工作的。作为一种面向文档的数据库,MongoDB 是一种更通用的 NoSQL 解决方案。它应该被视为关系数据库的替代品。与关系数据库一样,它也可以受益于与其他更专业的 NoSQL 解决方案配对。把它想象成任何一个存储特定结构数据的数据库。让我们先设置好您的环境,享受 MongoDB 的强大功能,并开始考虑在您认为合适的地方将其用于您的项目。
设置 MongoDB
设置和运行 MongoDB 非常简单。
- 前往 官方下载页面 并获取您选择的二进制文件。
- 解压归档文件(任意位置),然后导航到 _bin_ 子文件夹。请注意,_mongod_ 是服务器进程,_mongo_ 是客户端 shell - 这是我们将花费大部分时间的两个可执行文件。
- 在 _bin_ 子文件夹中创建一个名为 _mongodb.config_ 的新文本文件。
- 在您的 _mongodb.config_ 文件中添加一行:
dbpath=PATH_TO_WHERE_YOU_WANT_TO_STORE_YOUR_DATABASE_FILES
。例如,在 Windows 上,您可以这样做:dbpath=c:\mongodb\data
。 - 确保您指定的
dbpath
路径存在。 - 使用
--config /path/to/your/mongodb.config
参数启动 mongod。例如,如果您将下载的文件解压到 _c:\mongodb\_,并创建了 _c:\mongodb\data\_,那么在 _c:\mongodb\bin\mongodb.config_ 中,您将指定 _dbpath=c:\mongodb\data\_。然后,您可以通过 _c:\ mongodb\bin\mongod --config c:\mongodb\bin\mongodb.config_ 从命令提示符启动 mongod。
希望您现在已经成功启动并运行了 MonogDB。如果您遇到错误,请仔细阅读输出 - 服务器在解释错误方面非常出色。您现在可以启动 _mongo_,它将连接到您正在运行的服务器的 shell。尝试输入 db.version()
以确保一切正常。希望您会看到您安装的版本号。继续输入 db.help()
,您将获得一个可以在 db 对象上执行的命令列表。
一些基本概念
让我们通过了解 MongoDB 的基本工作原理来开始我们的旅程。显然,这是理解 MongoDB 的核心,但它也有助于让我们对 MongoDB 的定位有一些更高层次的认识。
为了入门,我们需要理解六个基本概念。
- MongoDB 拥有与您可能已经熟悉的“数据库”相同的概念。在一个 MongoDB 实例中,您可以拥有零个或多个数据库,每个数据库都充当所有其他内容的顶级容器。您可以将其视为 Microsoft SQL Server 中简单的数据库对象,以便更清晰地理解这个概念。
- 一个数据库可以有一个或多个“集合”。集合与传统 `表` 具有相同的概念,您可以将两者视为相同的东西。
- 集合由零个或多个“文档”组成。文档可以被认为是“行”。
- 文档由一个或多个“字段”组成,您可以猜测,这些字段就像“列”。
- MongoDB 中的“索引”功能与它们的 RDBMS 对应物非常相似。
- “游标”与其他五个概念不同。当您向 MongoDB 请求数据时,它会返回一个游标,您可以对其进行处理,例如计数或跳过,而无需实际下载数据。
总之,MongoDB 由数据库组成,数据库包含集合。集合由文档组成。每个文档由字段组成。集合可以被索引,这会提高查找和排序性能。最后,当我们从 MongoDB 获取数据时,我们通过游标进行,游标会延迟执行直到需要时,可以称之为 _懒加载_。
虽然这些概念与它们的关系数据库对应物相似,但它们并不完全相同。核心区别在于关系数据库在表级别定义列,而面向文档的数据库在文档级别定义其字段。集合中的每个文档都可以拥有自己独特的字段集。因此,集合是表的一个容器,而文档比行包含更多信息。
开始使用 MongoDB
首先,我们将使用全局 _use_ 方法切换数据库,继续输入 _use mycompany_。即使数据库尚未真正存在也没关系。我们创建的第一个集合也会创建实际的 _mycompany_ 数据库。
现在您已经进入了一个数据库,您可以开始发出数据库命令,例如 db.getCollectionNames()
。如果这样做,您应该会得到一个空数组([])。由于集合是无模式的,我们不需要显式创建它们。我们可以简单地将文档插入到一个新集合中。
要做到这一点,请使用 insert
命令,并提供要插入的文档
db.departments.insert({name: 'Human Resource', city: 'karachi', head: 'Muhammad Ibrahim'})
上面的行在 departments
集合上执行 insert
命令,并传递一个参数。MongoDB 内部使用二进制序列化 JSON 格式。外部来看,这意味着我们经常使用 JSON,就像我们的参数一样。如果我们现在执行 db.getCollectionNames()
,我们将看到两个集合:departments
和 system.indexes
。system.indexes
为每个数据库创建一次,并包含我们数据库索引的信息。您现在可以对 departments
使用 find 命令来返回文档列表
db.departments.find()
请注意,除了您指定的数据之外,还有一个 _id
字段。每个文档都必须有一个唯一的 _id
字段。您可以自己生成一个,也可以让 MongoDB 为您生成一个 ObjectId
。大多数时候,您可能会希望让 MongoDB 为您生成它。默认情况下,_id
字段是索引的 - 这解释了为什么创建了 system.indexes 集合。您可以查看 system.indexes
db.system.indexes.find()
您看到的是索引的名称、创建该索引的数据库和集合以及包含在索引中的字段。
现在,回到我们关于无模式集合的讨论。向 departments
插入一个完全不同的文档,例如
db.departments.insert({name: 'Development', country: 'Pakistan', _
departmentManager: 'Saeed Anwar', annualBudget: 5000000})
再次使用 find
列出文档。希望您现在开始理解为什么传统术语不合适了。
在深入研究选择器之前,您需要掌握 MongoDB 的一个实际方面:查询选择器。MongoDB 查询选择器就像 SQL 语句的 where
子句。因此,当您从集合中查找、计数、更新和删除文档时,您会使用它。选择器是一个 JSON 对象,其中最简单的是 {}
,它匹配所有文档(null
也可以)。如果我们想要 Karachi
市的所有部门,我们可以使用 {city:'Karachi'}
。
在深入研究选择器之前,让我们设置一些数据来玩玩。让我们在 Employees
集合中插入一些数据,请记住,虽然它尚不存在,但当您尝试向该集合插入数据时,MondoDB 会在当前数据库中创建该集合。
db.employees.insert({name: 'Amir Sohail', dob: new Date(1973,2,13,7,47),
hobbies: ['cricket','reading'], city: 'Karachi', gender: 'm'});
db.employees.insert({name: 'Inzama-ul-Haq', dob: new Date(1977,2,13,7,47),
hobbies: ['cricket','browsing'], city: 'Lahore', gender: 'm'});
db.employees.insert({name: 'Muhammad Yousuf', dob: new Date(1978, 0, 24, 13, 0),
hobbies: ['football','chatting'], city: 'Karachi', gender: 'm'});
db.employees.insert({name: 'Muhammad Younis', dob: new Date(1982, 0, 24, 13, 0),
hobbies: ['watching movies'], city: 'Peshawar',
gender: 'm', department:'Human Resource'});
db.employees.insert({name: 'Shahid Afridi', dob: new Date(1983, 0, 24, 13, 0),
hobbies: ['basketball','chatting'], city: 'Karachi',
gender: 'm', department:'Development'});
db.employees.insert({name: 'Moin Khan', dob: new Date(1978, 0, 24, 13, 0),
hobbies: ['cricket','chatting', 'browsing'], city: 'Islamabad', gender: 'm'});
db.employees.insert({name: 'Afra Kareem', dob: new Date(1993, 0, 24, 13, 0),
hobbies: ['reading','browsing'], city: 'Karachi', gender: 'f', department:'Development'});
db.employees.insert({name: 'Asma Khan', dob: new Date(1985, 0, 24, 13, 0),
hobbies: ['reading','watching movies'], city: 'Lahore',
gender: 'f', department:'Human Resource'});
db.employees.insert({name: 'Nazia Malik', dob: new Date(1984, 0, 24, 13, 0),
hobbies: ['reading'], city: 'Karachi', gender: 'f', department:'Development'});
db.employees.insert({firstName: 'Waqar', lastName: 'Younis',
dob: new Date(1978, 0, 24, 13, 0),
hobbies: ['cricket','chatting', 'basketball', 'browsing'], city: 'Karachi', gender: 'm'});
db.employees.insert({name: 'Waseem Akram', dob: new Date(1975, 0, 24, 13, 0),
hobbies: ['cricket','chatting'], city: 'Rawalpindi', gender: 'm'});
db.employees.insert({name: 'Shoaib Akhtar', dob: new Date(1980, 0, 24, 13, 0),
hobbies: ['football'], city: 'Rawalpindi', gender: 'm'});
db.employees.insert({name: 'Muhammad Amir', dob: new Date(1978, 0, 24, 13, 0),
hobbies: ['bowling'], city: 'Karachi', gender: 'm'});
db.employees.insert({name: 'Saeed Ajmal', dob: new Date(1983, 0, 24, 13, 0),
hobbies: ['spin bowling'], city: 'Karachi', gender: 'm'});
db.employees.insert({name: 'Abdur Rehman', dob: new Date(1982, 0, 24, 13, 0),
hobbies: ['bowling'], city: 'Lahore', gender: 'm'});
db.employees.insert({name: 'Muhammad Mushtaq', dob: new Date(1972, 0, 24, 13, 0),
hobbies: ['cricket','chatting'], city: 'Lahore', gender: 'm'});
db.employees.insert({firstName: 'Saqlain', lastName: 'Mushtaq',
dob: new Date(1978, 0, 24, 13, 0),
hobbies: ['football','chatting'], city: 'Karachi',
gender: 'm', department:'Development'});
现在我们有了数据,就可以掌握选择器了。{field: value}
用于查找字段等于值的任何文档。{field1: value1, field2: value2}
是我们进行 and
语句的方式。特殊的 $lt
、$lte
、$gt
、$gte
和 $ne
用于小于、小于等于、大于、大于等于和不等于操作。例如,要获取所有居住在 Karachi
的男性员工,我们可以这样做:
db.employees.find({gender: 'm', city: 'Karachi'})
$exists
运算符用于匹配字段是否存在,例如:
db.employees.find({firstName: {$exists: false}})
应该返回一个文档。如果我们想要 OR
而不是 AND
,我们使用 $or
运算符并将其分配给我们要进行 or
操作的值的数组。
db.employees.find({gender: 'f', $or: [{hobbies: 'reading'}, {hobbies: 'browsing'}, {
city: 'Karachi'}]})
上面的代码将返回所有爱好是 reading
或 browsing
,或者居住城市是 Karachi
的女性 employees
。我们的最后一个例子中有些东西非常巧妙。您可能已经注意到了,但 loves 字段是一个数组。MongoDB 支持数组作为一等对象。这是一个非常方便的功能。一旦您开始使用它,您就会想知道没有它您是怎么过的。更有趣的是基于数组值进行选择是多么容易:{hobbies: ' cricket'}
将返回 hobbies
数组中包含 cricket
的任何文档。比我们到目前为止看到的更多的运算符可用。其中最灵活的是 $where
,它允许我们提供要服务器上执行的 JavaScript。这些都在 MongoDB 网站的“高级查询”部分进行了描述。但是,我们所涵盖的内容是您入门所需的基础知识。这也是您将经常使用的内容。我们已经看到了这些选择器可以与 find
命令一起使用。它们也可以与 remove 命令(我们已经简要介绍过)、count
命令(我们还没有介绍过,但您大概可以猜出来)一起使用。MongoDB 为我们的 _id
字段生成的 ObjectId
可以这样选择:
db.employees.find({_id: ObjectId("TheObjectId")})
我们有 remove()
命令用于删除。要删除所有记录,您只需在所需集合上调用它即可。
db.employees.remove()
或者,您也可以放置所需的查询选择器来删除选定的文档。
关注点
我们已经成功启动并运行了 MongoDB,简要查看了 insert
和 remove
命令。我们还介绍了 find,并了解了 MongoDB 选择器的作用。我们有一个良好的开端,为未来的学习打下了坚实的基础。信不信由你,您实际上已经知道了关于 MongoDB 的大部分知识 - 它确实 meant to be 快速学习且易于使用。插入不同的文档,可能在新集合中,并熟悉不同的选择器。使用 find、count 和 remove。在自己尝试几次之后,一开始可能显得 awkward 的事情Hopefully 会变得顺畅。
希望我能写另一篇文章介绍如何在 C#.NET 环境中使用 MongoDB。我非常感谢您的反馈/评论或您在这方面提出的任何改进建议,以帮助使文章更加完善并对他人有所帮助。
历史
- 2012 年 1 月 30 日:初始发布