文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
文档是一组键值(key-value)对(即 BSON),一个简单的文档例子如下:
{"id":1,"name":"goudan", "address":"beijing"}
下表为MongoDB中常用的几种数据类型。
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
ObjectId
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
接下来的 3 个字节是机器标识码
紧接的两个字节由进程 id 组成 PID
最后三个字节是随机数
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
> var newObject = ObjectId() > newObject.getTimestamp() ISODate("2022-05-10T10:17:55Z")
ObjectId 转为字符串
> newObject.str 62a46bd34c256eb2b320f207
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document) 或 db.collection.insertOne() 和 db.collection.insertMany() ? #3.2 版本之后新增 或 db.COLLECTION_NAME.save(document)
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
db.collection.insertMany() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertMany(
? [ <document 1> , <document 2>, ... ], ? -- insertOne()时这儿就一个文档,不需要数组即可
? {
? ? writeConcern: <document>,
? ? ordered: <boolean>
? }
)
参数说明:
document:要写入的文档。
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
ordered:指定是否按顺序写入,默认 true,按顺序写入。
写入案例
-- myTable中添加1个文档 > db.myTable.insert({"id":1,"name":"goudan", "address":"beijing"}) WriteResult({ "nInserted" : 1 }) ? -- myTable中添加1个文档 > db.myTable.insertOne({"id":2,"name":"mz", "address":"beijing"}) { "acknowledged" : true, "insertedId" : ObjectId("62a46e194c256eb2b320f209") } ? -- myTable中添加2个文档 > db.myTable.insertMany([{"id":3,"name":"shanjige", "address":"beijing"},{"id":4,"name":"haonan", "address":"jianshazui"}]) { "acknowledged" : true, "insertedIds" : [ ObjectId("62a46e644c256eb2b320f20a"), ObjectId("62a46e644c256eb2b320f20b") ] } ? -- myTable中添加1个文档 > db.myTable.save({"id":5,"name":"renzha", "address":"tangshan"}) WriteResult({ "nInserted" : 1 }) ? > db.myTable.find() { "_id" : ObjectId("62a46dee4c256eb2b320f208"), "id" : 1, "name" : "goudan", "address" : "beijing" } { "_id" : ObjectId("62a46e194c256eb2b320f209"), "id" : 2, "name" : "mz", "address" : "beijing" } { "_id" : ObjectId("62a46e644c256eb2b320f20a"), "id" : 3, "name" : "shanjige", "address" : "beijing" } { "_id" : ObjectId("62a46e644c256eb2b320f20b"), "id" : 4, "name" : "haonan", "address" : "jianshazui" } { "_id" : ObjectId("62a46eae4c256eb2b320f20c"), "id" : 5, "name" : "renzha", "address" : "tangshan" }