<audio id="audio" title="062 | 文档数据库的缔造者MongoDB（上）" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/e9/f4/e9208541144a426047f7e3a82a902cf4.mp3"></audio>

大数据和云计算的风被谷歌吹起来的时候，被谷歌收购的网络广告公司DoubleClick的原CEO和CTO们觉得自己应该蹭上时代的列车，再次创业，然后10gen公司就这样在纽约诞生了。它的创始人分别是DoubleClick的创始人兼CTO德怀特 · 梅里曼（Dwight Merriman）、CEO凯文 · 瑞安（Kevin Ryan），以及工程师埃利特 · 霍洛威兹（Eliot Horowitz）。

公司成立之初，创始人的想法和MongoDB这个产品毫无关系：他们想做一个云计算的服务，并用开源的东西来搭建。然而很遗憾，这几位二次创业的人在开源社区找了一圈，也没有看到一个让人满意的东西。于是，怀着构建伟大云计算服务的梦想，他们决定先把这个事情停一停，先搭一个自己满意的数据库出来。这个数据库就是后来赫赫有名的MongoDB。

MongoDB的名字需要解释一下。国内很多人觉得是“芒果数据库”，其实不是的。在英文里，“芒果”是Mango，而Mongo是humongous的中间部分，在英文里是“巨大无比”的意思。所以MongoDB可以翻译成“巨大无比的数据库”，更优雅的叫法是“海量数据库”。

这几位创始人的梦想就是创建一个和过去关系数据库完全不一样的数据库，使之具有这样一些特点：海量数据库、数据库的模型极其灵活、适合程序员使用。

**大概怀着伟大理想的人都会做出伟大的产品。**MongoDB注定是独特的，在历史上会留下浓重一笔的产品。

当MongoDB开发出来的时候，创始人们给它的定义是：这是一个面向集合的、模式自由的文档型数据库。听到这里，你可能觉得有点晕了，那就先普及一下数据库的基本常识吧。

在过去的30多年里，整个工业界的数据库被所谓的关系数据库所主导。一个不太严谨的说法是：关系数据库的基本存储单元是表。而一张表则是有行有列的数据集合，而列的定义有严格的类型。所以关系数据库是一个严格定义的数据模型，每张表里的每条记录都是一个样的。

查询关系数据库的标准语言叫作SQL。SQL这个东西自从IBM发明出来以后，已经有30多年的历史了，人们爱它的有，恨它的也有。但是通常来说，程序员不太喜欢这个东西，因为它的基本理念和程序员编程的想法不一致。后来所谓的NoSQL风，指的就是那些不用SQL作为查询语言的数据存储系统，而文档数据库MongoDB正是NoSQL的代表。

**和关系数据库相反，MongoDB的数据模型很不一样。**简单来说，MongoDB面向的是集合而不是表，所有的数据存储都以集合为单位，而每个集合里面包含的东西则称为文档，一个集合可以包含无数个文档。每个文档，我们可以大致认为是个JSON数据模型。文档自带元数据。也就是说，MongoDB里面每个集合的每个文档并不要求数据严格一致，而是可能千差万别。

**MongoDB还有一个特色，它的查询使用的不是SQL，而是程序语言和API。**这样一来，MongoDB对程序员就是一个非常友善的选择。当然，对于原本非常熟悉SQL的DBA和数据分析人员，这就显得不太友好了。

MongoDB这个数据模型其实是非常脑洞大开的。在数据库领域的几十年发展里，很多人都试过各种各样挑战关系数据库的模型，但是鲜有成功的。即使成功了，也往往让人感觉雷声大雨点小，并不会对关系数据库的根本造成实质性的影响。然而MongoDB这个东西一出现，对有经验的数据库从业人员和使用者来说，第一个感觉就是这个东西是来搞事情的。

**在开发MongoDB的过程中，随着开发的深入，10gen的人越来越觉得原来那个云计算平台是个虚无缥缈的东西。而这个他们一手缔造的文档数据库，可能是一个惊天动地的大杀器！虽然这些人其实不是数据库领域科班出身的，但他们对于数据库领域某些弊端的深刻理解，的确是一般人望尘莫及的。**

于是他们决定彻底忘记那个云计算平台，集中精力开发这个被命名为“巨大无比的数据库”的产品。在漫长的开发过后，**2009年2月10gen正式开源了MongoDB的第一个版本。这对于10gen来说是一个非常重要的里程碑。**

然而我们必须要说，这个产品尽管看起来很新颖很有意思，但并不是一个很成熟的产品。它有无数多的东西没实现，有无数多的坑等着人们去踩。但是这些都已经不重要了，踩着NoSQL的东风，MongoDB开始飞起来了。

**10gen是一家特别注重宣传的公司，它在早期就对如何花钱做宣传非常有一套。**他们的做法是在全球各地资助成立很多的用户组，并组织每年一次的MongoDB大会。MongoDB还开起了Mongo大学。他们知道自己产品的用户都是开发人员，因此只要开发人员说好，尤其是各个地区那些在圈内有名的技术大牛说好，那么不管这个产品实际上好不好，完善不完善，炒起来的感觉起码很好。

**先把大家都绑上Mongo的船，再慢慢地修理这艘船也是一种做法。**俗话说“吃人的嘴短，拿人的手软”，那些在10gen支持下成长起来的用户组，那些10gen给报销机票和旅馆来做宣讲的大牛们，互利互惠地就借着NoSQL的东风把MongoDB给“吹”起来了。

10gen的CTO在某次采访中就说，他觉得与其花费那么多钱去做各种各样的广告，不如把钱花在资助用户组，资助MongoDB的会议上。让大家感觉到MongoDB产品好，公司对社区的支持力度大，是10gen花广告费的最佳途径。

踏上MongoDB“贼船”的公司很多，比如说卖车的Edmunds、美国版的“五八同城”Craigslist，以及老牌网络企业——思科。但是这些都比不上当年非常优秀的社交初创公司独角兽FourSquare使用MongoDB的影响来的大。当然这家公司现在是过气了，但在社交网络最为火爆的时候，FourSquare可是非常著名的。

在MongoDB刚出来的时候，FourSquare整个地“搬家”去用MongoDB，这曾是一件非常大的事情。这件事情当然被10gen公司大书特书地进行宣传。而MongoDB在独角兽里面被广泛使用这一事实，让MongDB是新时代的数据库、MongoDB适合开发APP，以及MongoDB适合创业公司使用等等的观点，都瞬间被“吹”了起来。

到2012年的时候，作为10gen公司创始人之一的梅里曼，其与人联合运营的科技博客Business Insider把MongoDB作为仅次于HTML的新时代最重要的技能宣传给大家。一时间仿佛只要MongoDB掌握好了，就能够有一碗饭吃。而很多在线教育网站也专门开起课来，给那些急于从其他职业转战IT的人普及MongoDB的用法。

我们必须说，这种宣传非常成功。大概是因为MongoDB的创业者在这之前已经成功创业一次，要知道DoubleClick在网络广告领域非常成功，而且被成功卖给了谷歌，所以这些人搞创业公司的套路，一点都不像那些毫无经验的初创公司创始人。他们非常懂得如何做才能够最大限度地吸引眼球，最大程度地把自己的产品铺出去。至于盈利与否，在初创阶段，并不是他们最需要关心的问题。无论从何种角度去看，这个做法都很成功。

**除了在商业宣传上很成功，10gen发布MongoDB以后，在产品的开发和维护上也采取了和其他公司很不一样的策略。**这个策略对于MongoDB的流行同样功不可没。

简单一点来说，10gen公司决定集中精力做最重要的几件事情：

1. 吸引客户上MongoDB的船；
1. 让MongoDB更好用；
1. 对常用的编程语言，提供各种各样的库和接口的支持；
1. 整个技术支持团队非常地友善，而且尽职尽责。

10gen公司重点去做的这些事情，有很多值得我们深思的地方。如果要简单概括的话，就是10gen公司希望所有使用MongoDB的用户都觉得这个产品非常非常地好用。如果万一真的出了问题，也有很好的技术支持来及时地解决问题。

**这种用户体验，绝对是开源社区中其他产品所不能达到的高度。**举个简单的例子，要想自己去部署Hadoop的一个计算集群，那绝对是一件老难老难的事情了。如果这个东西容易部署，也就不会诞生一批以卖“更好用的Hadoop”为生的公司了。再举个例子，Hive的部署也同样不好用。

如果我们从企业级应用上来看，Oracle就是一个非常典型的难用的产品。一个企业如果想要把Oracle用好了，请有经验的DBA是基本条件，很多时候都需要咨询公司来帮助设计解决方案。这种项目的落地绝非简简单单就能行的。而SQL Server作为一个后起之秀，在数据库市场获得成功的一个重要原因，并非性能有多好，而是“很好用”。当然，SQL Server只是和Oracle比起来好用得多。

但是MongoDB就不一样了，10gen公司的目标就是让MongoDB非常非常地好用。而且从这一点上说，他们做得非常成功。整个社区里无数的用户组在提供支持，10gen自己的客服绝对是用户至上，有问必答，而且非常礼貌及时。整个10gen的开发重点，也是让用户更好上手。

所有的因素加起来，MongoDB对于创业公司来说就变得很有意思了：这个产品很好上手，支持也很多，而且还免费。创业公司拿着这个轮子，可以迅速实现自己的业务逻辑，而不需要再去学习怎么搭东西。我想正是这个原因，突然之间就着NoSQL的春风，MongoDB就开始流行起来了。

**然而，接下来事情的发展，多少有些脱离美好的一面。MongoDB从产品的角度来说，其实就是个半成品。MongoDB实在有太多的东西没有做了，尤其是那些基本的东西，包括数据是不是会丢、结果是不是错的、并发做得好不好、支不支持事务处理，以及当规模上来的时候，能不能够通过加机器来解决问题。**

这些看起来本应是一个数据库产品非常重要的、基本的东西，MongoDB做得却很差。一般来说，当一个人开始用MongoDB的时候，并不会遇到这样的问题，当然主要还是规模不够大，不至于触发瓶颈和问题。当APP或者网站的规模上去之后，同时工作的人多了，问题就会越来越常见，越来越令人无法忍受。

**而10gen的CEO在宣传时，又往往以极其夸大的方式，告诉大家MongoDB就是未来，MongoDB就是一切。**这样的结果就是：很多人用MongoDB去取代关系数据库。然而渐渐地，这些人发现这种取代并没有带来真正的好处，除了一开始开发省了点力气外，后面要维护的成本越来越高。

**而10gen这种侧重于提高用户初始体验，外加一切都是MongoDB的宣传方式，终于导致了负面作用。**有经验的程序员开始跳出来，在各种论坛里公开宣称千万别上MongoDB的“贼船”，因为虽然开船的时候容易，接下来要付出的代价也很大，一旦规模上来，各种丢数据的问题就都出来了。

10gen的CTO经常亲自上阵去和这些程序员们PK。他接受采访的时候说，MongoDB是个新产品嘛，新产品总是会有这样那样的问题，请给我们一些时间。他在论坛上和这些程序员交流，通常来说跳不出这样一些套路，就是：

1. 这个问题我们在下一版里会修好的；
1. 这个问题我从来没有遇到过，估计是假的吧；
1. 这个问题你给我们开BUG啊；
1. 这个问题我不相信是真的，肯定是你们程序写错了。

不管你信不信，这种回复，加上10gen的公关能力，确实在很多时候给MongoDB赢得了修复问题的时间。但是这样的一种方式也让用户的接受度在降低。2009到2012的三年里，MongoDB被接受的比例一直处于飞升状态，而2012年开始这个曲线就越来越平。大家到底要不要用MongoDB，已经不再是“无脑”上的问题，而是要反复斟酌之后再做决定的事情。

尽管10gen的CEO一直高调宣布MongoDB无所不能，大家赶紧上，实际上后面的几年里，很多人反而是渐渐地离开了MongoDB。大家意识到，MongoDB作为一个一开始上手很快的东西，可能只适合一个V1产品。产品上一点规模之后，背后的数据存储系统还是要换的。

当然，任何公司都有盈利的压力。MongoDB作为一个开源、免费的产品，10gen公司不可能免费赚吆喝，它烧在社区建设上的钱也不是小数目。**10gen推出盈利产品的第一步，是推出了对MongoDB的商业付费技术支持。**

商业付费支持是很多公司常用的方式。比如说Hadoop平台公司的Hortonworks，其收入就基本上依赖于其提供的商业付费技术支持。MongoDB从这里开始赚第一笔钱，并且其技术支持以“态度好”而著称。

**仅仅靠商业技术支持并不能为公司带来足够的收入，10gen的另外一个创收途径是推出商业版的MongoDB。**和开源的MongoDB比起来，商业版的自然要带更多的功能。这些功能最主要的是一个加密的存储引擎——数据以企业级密码强度加密后再存储，以及额外的安全相关的功能，比如说LDAP和Kerberos的支持，等等。这方面倒是体现了企业级应用市场和开源小创业公司之间的差异：企业级应用市场对加密和安全相关的内容要重视得多，没有这些功能大企业是不会使用这些产品的。

在很长时间里，MongoDB的企业版都是10gen公司最主要的收入来源。此外，10gen也提供云上的托管服务，给那些不愿意自己管理数据库的人提供服务。MongoDB的业务模式和赚钱模式都还是很清晰的，但是一个巨大的问题在突显：MongoDB作为一个数据库，始终都不是一个成熟的产品，并因此给很多采用MongoDB的企业带来了一些出乎意料的东西。

**2013年的时候，10gen公司觉得自己的名字已经不太符合现在的品牌效应了，于是正式更名为MongoDB公司，将产品名和公司名匹配起来。**

尽管MongoDB的发展经历了很多曲折，它的产品在功能上、性能上有很多问题，乃至受到了某些程序员的公开抵制；尽管MongoDB的接受度自2012年以来开始大幅度降低，它在企业市场上却依然保持着一个非常可观的占有率。

今天，我详细讲了10gen在MongoDB的开发、推广、发展和营收上的策略。MongoDB侧重于易用性和对社区的支持，对其他方面则有些忽视了。那么，倘若你在运营一家做工具类产品的初创公司，在技术发展上又会采取什么样的策略呢？


