开始使用MongoDB之前应该知道的14件事
Lookup的功能和SQL联合查询类似。为了获得良好的性能,作为外键的键值上需要有索引。这并不明显,因为其使用并没有在explain()中报告。这些索引并不包含在explain()记录的索引里,那些索引是供管道操作符$match、$sort出现在管道开始时使用的。现在,索引可以覆盖聚合管道的任何阶段。 不使用多条更新 db.collection.update()方法用于修改一个已存在文档的一部分或全部,或者是整个替换一个已存在的文档,这取决于你提供的更新参数。除非你设置multi参数,更新匹配查询条件的所有文档,否则它不会更新集合里的所有文档。这一点不是那么明显。 忘记哈希对象中键序的意义 在JSON中,一个对象包含一个无序集合,而该集合中有零个或多个名/值对,其中名是一个字符串,而值是一个字符串、数值、布尔值、空、对象或数组。 遗憾的是,BSON在做搜索时给顺序赋予了意义。在MongoDB中,嵌入对象中键的顺序很重要,也就是说,{ firstname: "Phil", surname: "factor" }和{ surname: "factor", firstname: "Phil" }就不匹配。这意味着,你必须保留文档中名/值对的顺序,如果你想确保可以找到它们的话。 混淆“null”和“undefined” 根据正式的JSON标准(ECMA-404第5节),“undefined”值在JSON中从来就是不合法的,虽然它事实上已经在JavaScript中使用。而且,它在BSON中是“deprecated”,会转换成$null,这并不是一个总令人满意的解决方案。在MongoDB中,要避免使用“undefined”。 使用$limit()而未用$sort() 通常,当你在MongoDB中开发时,仅仅查看查询或聚合返回的结果的样例会很有用。 $limit()就是为了满足这个要求,但是,它永远不应该出现在最终版本的代码中,除非你首先使用了$sort。这是因为,不这样的话,你就无法保证结果的顺序,你就无法可靠地“按页浏览”数据。为了确保可靠性,查询或聚合必须是“确定的”,就是说,它们每次执行都会给出相同的结果。包含$limit而不包含$sort的代码不是确定的,后续会导致难以跟踪的Bug。 小结 对于MongoDB,让你最终感到失望的唯一方式是把它直接和另一种类型的数据库如RDBMS比较,或者对它有特别的期待。这就像把桔子和叉子比较。数据库系统有它们的用途。最好是理解并领会这些差别。强迫MongoDB开发人员按照RDBMS的方式做事就太遗憾了,我希望继续看到解决旧问题的有趣的新方法,如确保数据完整性、使数据系统具有从故障和恶意破坏中恢复的能力。 在4.0版本中,MongoDB引入了ACID事务处理,这是以创新方式引入重大改善的一个很好的例子。多文档、多语句事务现在是原子的了,它允许开发人员调整用于获取锁的时间,过期挂起事务以及修改隔离级别。 【编辑推荐】
点赞 0 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |