一:创建MongoDB文档的简单介绍
文档主键_id
- 每个MongoDB文档必备的字段
- 文档主键具有唯一性
- 文档主键支持所有数据类型(
数组除外
) - 文档主键可以是复合主键:例如可以用其他文档来做文档主键
对象主键ObjectId
- 默认的文档主键
- 由客户端驱动程序快速生成的12字id
- 前4个字节为创建时间,精确到秒,除多文档同时被创建和各客户端的系统时间不同这两种情况之外,可以借此区分创建的先后顺序
创建文档
db.collection.insert()
db.collection.save()
- 创建多个文档
二:使用Mongo Shell进行实践
创建单个文档:db.collection.insertOne()
## 使用test数据库(不存在则创建)
use test
## 查看数据库中的集合
show collections
## 开始创建第一个文档
## 参数说明:
## collection:文档将要写入的集合
## 第一个document:想要写入的文档本身
## 第二个document:文档本次创建的的安全写级别,不提供则使用默认的
db.<collection>.insertOne(
<document>,
{
writeConcern:<document>
}
)
db.accounts.insertOne(
{
_id: "account1",
name: "alice",
balance: 100,
}
)
## 处理抛出的错误
try {
db.accounts.insertOne(
{
_id: "account1",
name: "alice",
balance: 100,
}
)
} catch(e) {
print(e)
}
## 自动生成_id字段
## 省略该字段就会自动创建
db.accounts.insertOne(
{
name:"bob",
balance:200,
}
)
创建多个文档:db.collection.insertMany()
db.<collection>.insertMany(
[<document1>,<document2>,...],
{
writeConcern:<document>,
ordered:<boolean>,
}
)
try {
db.accounts.insertMany(
[{
name:"Tom",
balance:300},
{
name:"Joke",
balance:50}],
{
ordered:false}
)
} catch(e) {
print(e)
}
创建单个或多个文档:db.<collention>.insert()
db.<collection>.insert(
<document or arrary of documents>,
{
writeConcern:<document>,
ordered:<boolean>
}
)
db.collection.insertOne()
,db.collection.insertMany()
和db.collection.insert()
之间的区别:
- 三者的返回结果不同
- 前两者不支持
db.collection.explain()
指令,insert
支持
另一个创建文档的命令:db.collection.save()
## 当创建一个新的文档的时候,就是调用db.collection.insert
db.<collection>.save(
<document>,
{
writeConcern:<document>
}
)
三:文档主键_id
的深入探讨
默认的文档主键:对象主键(ObjectId
)
- 生成一个新的对象主键:
ObjectId()
- 提取ObjectId的创建时间:
ObjectId("5df84f4c4c21c96be13ee5ab").getTimestamp()
复合主键
- 使用一个文档作为另一个文档的文档主键
- 例如:
db.accounts.insert( { _id:{accountNo:"001",type:"savings"}, name:"Joke", balance:600, } )
- 需要注意的是:复合主键中的文档主键也要确保唯一性,作为文档主键的文档如果字段顺序不同,哪怕内容一样,也是不一样的