当物流行业遇见MongoDB

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 快递物流系统里最常见的一种业务类型就是订单的查询和记录。利用MongoDB数据库能够帮助企业快速搭建物流快递系统,助力物流企业轻松上云

简介

快递物流系统里最常见的一种业务类型就是订单的查询和记录。订单的特点是随着递送过程,订单数据需要随时更新路径。数据结构上需要可以灵活应对,这点非常符合Document模型,并且MongoDB支持GIS功能,非常适用于MongoDB来支撑物流业务。并且MongoDB具备Sharding能力,而物流行业里订单比较独立,夸订单的操作很少,而对单订单来说,更新追加的操作会较多,比如再物流中转处理上。所以物流业务模型上与MongoDB非常的匹配。以下讲解一个虚拟的DEMO,可供参考,用到的特性:

  • MongoDB Document的数组结构
  • TTL索引,自动过期历史数据
  • 复合索引,多条件查询索引
  • Partial Indexes,条件索引,只索引有效数据,降低索引的占用空间
  • MongoDB GIS功能,支持GeoJSON标准,可以接入第三方系统处理GEO信息。

了解阿里云MongoDB详细配置及价格

ApsaraDB_For_

数据结构定义

{
  "_id": <String>,  // 订单ID
  "status": <String>, // 订单状态,shipping,deliveried等
  "order_image_url": <String>, // 订单图片信息
  "create_date": <ISODate>, // 订单创建日期
  "from": {    // 发货信息
      "city": <String>,  "address": <String>, 
      "name": <String>,  "phone": <String>, 
      "location": <GeoJSON> 
  },
  "delivery": {    // 收货信息
      "city": <String>,  "address": <String>, 
      "name": <String>,  "phone": <String>, 
      "location": <GeoJSON> 
  },
  "details": [   // 物流详情,数组结构
    {
      "action": "reviced",  // 物流动作
      "operator": "快递小哥1号",   // 操作员
      "date": <ISODate>
    }...
    ]
}

例如:

{
  "_id": "E123456789",
  "status": "delivering",
  "create_date": ISODate("2016-06-21T09:00:00+08:00"),
  "order_image_url": "http://oss/xxxxx.jpg",
  "from": {
    "city": "Hangzhou",
    "address": "文一西路969号",
    "name": "小王",
    "phone": "18657112345",
    "location": {
      "type": "Point",
      "coordinates": [
        120,
        30
      ]
    }
  },
  "delivery": {
    "city": "北京",
    "address": "朝阳区",
    "name": "朝阳群众",
    "phone": "18601011011",
    "location": {
      "type": "Point",
      "coordinates": [
        116,
        39
      ]
    }
  },
  "details": [
    {
      "action": "reviced",
      "operator": "快递小哥1号",
      "date": ISODate("2016-06-21T09:00:00+08:00")
    },
    {
      "action": "shipping",
      "station": "hangzhou-airport",
      "date": ISODate("2016-06-22T01:00:00+08:00")
    },
    {
      "action": "shipping",
      "station": "beijing-airport",
      "date":  ISODate("2016-06-22T07:00:00+08:00")
    },
    {
      "action": "shipping",
      "station": "chaoyang-station",
      "date":  ISODate("2016-06-22T15:00:00+08:00")
    },
    {
      "action": "delivering",
      "operator": "快递小哥2号",
      "date": ISODate("2016-06-23T10:00:00+08:00")
    }
  ]
}

几个注意点:

  • 利用了GEO特性,使用GeoJSON标准,但是坐标系上需要注意坐标标准问题;
  • 时间处理上,物流行业会涉及到国际化,所以严格按照ISO的标准,定义时间,CN+80:00
  • 订单详情里很好的利用了Document的数组特性;
  • 快递订单是唯一的,可以作为MongoDB的主键;

insert到collection中后的文档:

> db.order.find().pretty()
{
    "_id" : "E123456789",
    "status" : "delivering",
    "create_date" : ISODate("2016-06-21T01:00:00Z"),
    "order_image_url" : "http://oss/xxxxx.jpg",
    "from" : {
        "city" : "Hangzhou",
        "address" : "文一西路969号",
        "name" : "小王",
        "phone" : "18657112345",
        "location" : {
            "type" : "Point",
            "coordinates" : [
                120,
                30
            ]
        }
    },
    "delivery" : {
        "city" : "北京",
        "address" : "朝阳区",
        "name" : "朝阳群众",
        "phone" : "18601011011",
        "location" : {
            "type" : "Point",
            "coordinates" : [
                116,
                39
            ]
        }
    },
    "details" : [
        {
            "action" : "reviced",
            "operator" : "快递小哥1号",
            "date" : ISODate("2016-06-21T01:00:00Z")
        },
        {
            "action" : "shipping",
            "station" : "hangzhou-airport",
            "date" : ISODate("2016-06-21T17:00:00Z")
        },
        {
            "action" : "shipping",
            "station" : "beijing-airport",
            "date" : ISODate("2016-06-21T23:00:00Z")
        },
        {
            "action" : "shipping",
            "station" : "chaoyang-station",
            "date" : ISODate("2016-06-22T07:00:00Z")
        },
        {
            "action" : "delivering",
            "operator" : "快递小哥2号",
            "date" : ISODate("2016-06-23T02:00:00Z")
        }
    ]
}

数据操作

物流快递的订单修改主要是查询和信息追加两种,主要介绍这两种:

订单信息查询,最常见的操作,用户的订单查询:

db.order.find({_id:"E123456789"});

有时需要做信息统计,按照状态来查询:

db.order.find({"status":"delivering", "delivery.city":"北京", "delivery.address":"朝阳区"});

物流状态更新时,需要更新相应的订单,MongoDB上直接$push过去即可:

db.order.update( { _id:"E123456789"}, 
{$push: {details: 
{"action":"delivering", "operator" : "快递小哥3号", "date" : ISODate("2016-06-23T13:00:00+8:00")}
}})

索引创建

_id索引,默认存在,不需要再创建;当数据量较大时,可以使用sharding结构,shardkey的选择上可以使用Hash(_id)

TTL索引,字段create_date,180天后自动清理数据:

db.order.createIndex({"create_date":1}, {"expireAfterSeconds":15552000})

位置和状态索引,为了能快速处理“某地未处理订单”查询,这是一个多条件的查询,所以是一个复合索引,status字段放在前面,因为多数的查询都会依赖状态字段

db.order.createIndex({"status":1, "delivery.city":1, "delivery.address":1})

在这个Demo里,还有一种加快查询速度的方法就是,创建一个只包含指定状态的一个Partial Indexes索引。比如status必须为delivering 才加入到索引中,有效控制索引的大小,加快查询速度。

db.order.createIndex({"delivery.city":1, "delivery.address":1},{partialFilterExpression:{'status':{$eq:"delivering"}}})

MongoDB GIS

MongoDB遵循的事GeoJSON规范,对象的描述上通过一个type字段描述GeoJSON类型,coordinates字段描述空间信息。

{ type: "<GeoJSON type>" , coordinates: <coordinates> }

coordinates是一个[longitude, latitude]的数组类型。另外值得关注的是MongoDB GEO的使用的是WGS84标准。WGS84也是国际标准,中国使用的著名的火星坐标GCJ-02,还有一套百度坐标BD09,三者的坐标转换可以参考附录相关的链接。

附录

作者

叶翔,ApsaraDB For MongoDB 开发组

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
16天前
|
NoSQL MongoDB 数据库
数据库数据恢复——MongoDB数据库服务无法启动的数据恢复案例
MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的情况下拷贝数据库文件。将MongoDB数据库文件拷贝到其他分区后,对MongoDB数据库所在原分区进行了格式化操作。格式化完成后将数据库文件拷回原分区,并重新启动MongoDB服务。发现服务无法启动并报错。
|
6月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
1月前
|
存储 NoSQL MongoDB
微服务——MongoDB常用命令1——数据库操作
本节介绍了 MongoDB 中数据库的选择、创建与删除操作。使用 `use 数据库名称` 可选择或创建数据库,若数据库不存在则自动创建。通过 `show dbs` 或 `show databases` 查看所有可访问的数据库,用 `db` 命令查看当前数据库。注意,集合仅在插入数据后才会真正创建。数据库命名需遵循 UTF-8 格式,避免特殊字符,长度不超过 64 字节,且部分名称如 `admin`、`local` 和 `config` 为系统保留。删除数据库可通过 `db.dropDatabase()` 实现,主要用于移除已持久化的数据库。
74 0
|
1月前
|
存储 NoSQL MongoDB
从 MongoDB 到 时序数据库 TDengine,沃太能源实现 18 倍写入性能提升
沃太能源是国内领先储能设备生产厂商,数十万储能终端遍布世界各地。此前使用 MongoDB 存储时序数据,但随着设备测点增加,MongoDB 在存储效率、写入性能、查询性能等方面暴露出短板。经过对比,沃太能源选择了专业时序数据库 TDengine,生产效能显著提升:整体上,数据压缩率超 10 倍、写入性能提升 18 倍,查询在特定场景上也实现了数倍的提升。同时减少了技术架构复杂度,实现了零代码数据接入。本文将对 TDengine 在沃太能源的应用情况进行详解。
57 0
|
7月前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
2月前
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
4月前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
112 15
|
4月前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
|
5月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
6月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。

相关产品

  • 云数据库 MongoDB 版
  • 下一篇
    oss创建bucket