快递物流系统里最常见的一种业务类型就是订单的查询和记录。订单的特点是随着递送过程,订单数据需要随时更新路径。数据结构上需要可以灵活应对,这点非常符合document模型,并且mongodb支持gis功能,非常适用于mongodb来支撑物流业务。并且mongodb具备sharding能力,而物流行业里订单比较独立,夸订单的操作很少,而对单订单来说,更新追加的操作会较多,比如再物流中转处理上。所以物流业务模型上与mongodb非常的匹配。以下讲解一个虚拟的demo,可供参考,用到的特性:
mongodb document的数组结构
ttl索引,自动过期历史数据
复合索引,多条件查询索引
partial indexes,条件索引,只索引有效数据,降低索引的占用空间
mongodb gis功能,支持geojson标准,可以接入第三方系统处理geo信息。
<a href="https://mongodb.console.aliyun.com/#/buy/mongodb">了解阿里云mongodb详细配置及价格</a>

例如:
几个注意点:
利用了geo特性,使用geojson标准,但是坐标系上需要注意坐标标准问题;
时间处理上,物流行业会涉及到国际化,所以严格按照iso的标准,定义时间,cn<code>+80:00</code>;
订单详情里很好的利用了document的数组特性;
快递订单是唯一的,可以作为mongodb的主键;
insert到collection中后的文档:
物流快递的订单修改主要是查询和信息追加两种,主要介绍这两种:
订单信息查询,最常见的操作,用户的订单查询:
有时需要做信息统计,按照状态来查询:
物流状态更新时,需要更新相应的订单,mongodb上直接<code>$push</code>过去即可:
<code>_id</code>索引,默认存在,不需要再创建;当数据量较大时,可以使用sharding结构,shardkey的选择上可以使用<code>hash(_id)</code>。
ttl索引,字段<code>create_date</code>,180天后自动清理数据:
位置和状态索引,为了能快速处理“某地未处理订单”查询,这是一个多条件的查询,所以是一个复合索引,<code>status</code>字段放在前面,因为多数的查询都会依赖状态字段
在这个demo里,还有一种加快查询速度的方法就是,创建一个只包含指定状态的一个partial indexes索引。比如<code>status</code>必须为<code>delivering </code>才加入到索引中,有效控制索引的大小,加快查询速度。
mongodb遵循的事geojson规范,对象的描述上通过一个type字段描述geojson类型,coordinates字段描述空间信息。
{ type: "<geojson type>" , coordinates: <coordinates> }
coordinates是一个<code>[longitude, latitude]</code>的数组类型。另外值得关注的是mongodb geo的使用的是wgs84标准。wgs84也是国际标准,中国使用的著名的火星坐标gcj-02,还有一套百度坐标bd09,三者的坐标转换可以参考附录相关的链接。
geojson
<a href="https://docs.mongodb.com/manual/reference/geojson/">https://docs.mongodb.com/manual/reference/geojson/</a>
<a href="http://geojson.org/geojson-spec.html">http://geojson.org/geojson-spec.html</a>
<a href="https://docs.mongodb.com/manual/reference/glossary/#term-wgs84">https://docs.mongodb.com/manual/reference/glossary/#term-wgs84</a>
mongodb geo index
<a href="https://docs.mongodb.com/manual/core/2dsphere/">https://docs.mongodb.com/manual/core/2dsphere/</a>
<a href="https://docs.mongodb.com/manual/reference/glossary/#term-legacy-coordinate-pairs">https://docs.mongodb.com/manual/reference/glossary/#term-legacy-coordinate-pairs</a>
geohack
geo datum
<a href="https://github.com/wandergis/coordtransform">https://github.com/wandergis/coordtransform</a>
叶翔,apsaradb for mongodb 开发组