数据记录如下

/* 1 */
{
    "_id" : ObjectId("5b56dd19a171d7e9bfb03ac1"),
    "name" : "a",
    "BWH" : {
        "bust" : 100,
        "waist" : 100,
        "hips" : 100
    },
    "character" : [ 
        "afraid of loneliness", 
        "goodness", 
        "delicate", 
        "lovely"
    ],
    "others" : {
        "friends" : {
            "xt" : 23,
            "Tom" : 24
        },
        "location" : {
            "longitude" : 104.07,
            "latitude" : 30.67
        }
    }
}

/* 2 */
{
    "_id" : ObjectId("5b56dd19a181d7e9bfb03ac2"),
    "name" : "SF",
    "BWH" : {
        "bust" : 100,
        "waist" : 100,
        "hips" : 100
    },
    "character" : [ 
        "lonely", 
        "easy to satisfy"
    ],
    "others" : {
        "desc" : "a dota hero"
    }
}

  

把一个对象当做一个字段存储

如上面的表记录所示,字段"BWH","character","others"存的都是一个对象,有的还有嵌套对象。

数组对象

"character"是一个数组对象

属性固定的对象

"BWH"是固定的属性的对象

属性不固定的对象

“others”对象中的属性是不固定,在Java中可以用Maporg.bson.Document来进行存储

 

基于位置的数据查询(空间索引)

将MongoDB的查询条件设置为一个区域数据记录如果有表示Point的字段,可以根据Point字段查询出所有在这个区域的记录。

Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内):https://www.cnblogs.com/theRhyme/p/9483076.html

 

存储文件(如图片)

GridFS能够存储文件,MongoDB的文档结构为BJSONBinary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中

https://blog.csdn.net/javahongxi/article/details/74131117

MongoDB作存储方便稳定易扩展,我们自己写的文件存储服务器肯定很LOW,除了含有巨量图片的大型系统,一般由公司自研图片存储外,大部分情况下,我们用mongodb足以应付。

 

更高的写入负载

https://www.cnblogs.com/imhurley/p/6060229.html

默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景。但是应当避免在高事务安全性的系统中使用MongoDB,除非能从架构设计上保证事务安全。

 

高可用性

MongoDB的复副集(Master-Slave)配置非常简洁方便,此外,MongoDB可以快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性

 

数据量很大或者未来会变得很大

依赖数据库(MySQL)自身的特性,完成数据的扩展是较困难的事,在MySQL中,当一个单达表到5-10GB时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用MySQL通常需要借助驱动层或代理层完成这类需求。

而MongoDB内建了多种数据分片的特性,可以很好的适应大数据量的需求。