Mongodb 集合插入文档自动生成ObjectId

这篇具有很好参考价值的文章主要介绍了Mongodb 集合插入文档自动生成ObjectId。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插入单个文档

Mongodb 使用以下几种方法来插入文档 , Mongodb V5.0+ 使用 mongosh 客户端:

  • 插入单个文档
    db.collection.insertOne() 将单个 文档插入到集合中。

如果该集合当前不存在,则插入操作将创建该集合。

如果文档未指定_id字段,则将在插入之前 mongod 添加该字段并为文档_id分配唯一的字段 。

insertOne() 方法具有以下语法:

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

注意,不同版本下面的 ObjectId 可选参数有差异,以下基于为 V4.4 版本:

ObjectId(<hexadecimal>) 返回新的ObjectId值。12 字节的ObjectId 值包括:

  • 一个 4 字节时间戳值,表示 ObjectId 的创建,以 Unix 纪元以来的秒数为单位。

  • 每个进程生成一次的 5 字节随机值。该随机值对于机器和进程来说是唯一的。

  • 一个 3 字节递增计数器,初始化为随机值。

以下示例获取 objectId()。 如 ObjectId(“64e2fb51bbd8c3243e14f05c”) ,其中

  • 64e2fb51: 对应十进制 1692597073( “2023-8-21 13:51:13” )即 UTC ( “2023-08-21T05:51:13Z” )。
    0110 0100 = 64
    1110 0010 = e2
    1111 1011 = fb
    0101 0001 = 51

(十六进制)64e2fb51 = 6*167 + 4*166 + 14*165 + 2*164 + 15*163 + 11*162 + 5*161 + 1*160
= 1610612736 + 67108864 + 14680064 + 131072 + 61440 + 2816 + 80 + 1
= 1692597073 (十进制)

  • bbd8c3243e: 每个进程生成一次的 5 字节随机值。
  • 14f05c: 一个 3 字节递增计数器。
sit_rs1:PRIMARY> x = ObjectId(); print(x);  x.getTimestamp()
ObjectId("64e2fb51bbd8c3243e14f05c")
ISODate("2023-08-21T05:51:13Z")


sit_rs1:PRIMARY> x = ObjectId(); print(x);  x.getTimestamp()
ObjectId("64e2fb53bbd8c3243e14f05d")
ISODate("2023-08-21T05:51:15Z")


sit_rs1:PRIMARY> x = ObjectId(); print(x);  x.getTimestamp()
ObjectId("64e2fb53bbd8c3243e14f05e")
ISODate("2023-08-21T05:51:15Z")
 
sit_rs1:PRIMARY> x = ObjectId(); print(x);  x.getTimestamp()
ObjectId("64e2fb56bbd8c3243e14f05f")
ISODate("2023-08-21T05:51:18Z")

尽管对象ID值应该随着时间的推移而增加,它们不一定是单调的。

这是因为他们:

  • 仅包含一秒的时间分辨率,因此对象ID在同一秒内创建的值没有保证的顺序。

  • 由客户端生成,这些客户端可能具有不同的系统时钟。

以下示例将新文档插入到 order2 集合中。如果文档未指定_id字段,MongoDB 会将_id具有 ObjectId 值的字段添加到新文档中,如下:

sit_rs1:PRIMARY> db.order2.insertOne({ cust_id: "A", ord_date: new Date("2023-06-01"), price: 15, items: [ { sku: "apple", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "1" }); 
{
        "acknowledged" : true,
        "insertedId" : ObjectId("64e31b9bbbd8c3243e14f060")
}

sit_rs1:PRIMARY> db.order2.find()
{ "_id" : ObjectId("64e31b9bbbd8c3243e14f060"), "cust_id" : "A", "ord_date" : ISODate("2023-06-01T00:00:00Z"), "price" : 15, "items" : [ { "sku" : "apple", "qty" : 5, "price" : 2.5 }, { "sku" : "apples", "qty" : 5, "price" : 2.5 } ], "status" : "1" }

插入多个文档

db.collection.insertMany() 可以将多个 文档插入到集合中。将文档数组传递给该方法。

insertMany() 方法具有以下语法:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

如果ordered设置为 false,文档将以无序格式插入,并且可以重新排序以mongod提高性能。如果使用无序,应用程序不应依赖于插入的顺序

在分片集合上执行ordered操作列表通常比执行 unordered列表慢,因为对于有序列表,每个操作都必须等待前一个操作完成。

排除Write Concern错误,有序操作在发生错误后停止 !!!!!!!!!,而无序操作继续处理队列中任何剩余的写操作。

以下示例将三个新文档插入到 order2 集合中。如果文档未指定 _id字段,MongoDB 会_id向每个文档添加带有 ObjectId 值的字段

sit_rs1:PRIMARY> db.order2.insertMany([   
...    { cust_id: "A", ord_date: new Date("2023-06-08"), price: 60, items: [ { sku: "apple", qty: 8, price: 2.5 }, { sku: "banana", qty: 5, price: 10 } ], status: "1" },
...    { cust_id: "B", ord_date: new Date("2023-06-08"), price: 55, items: [ { sku: "apple", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "1" },
...    { cust_id: "B", ord_date: new Date("2023-06-18"), price: 26, items: [ { sku: "apple", qty: 10, price: 2.5 } ], status: "1" },
...    { cust_id: "B", ord_date: new Date("2023-06-19"), price: 40, items: [ { sku: "banana", qty: 5, price: 10 } ], status: "1"},
...    { cust_id: "C", ord_date: new Date("2023-06-19"), price: 38, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "1" },
...    { cust_id: "C", ord_date: new Date("2023-06-20"), price: 21, items: [ { sku: "apple", qty: 10, price: 2.5 } ], status: "1" },
...    { cust_id: "D", ord_date: new Date("2023-06-20"), price: 76, items: [ { sku: "banana", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "1" },
...    { cust_id: "D", ord_date: new Date("2023-06-20"), price: 51, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "apple", qty: 10, price: 2.5 } ], status: "1" },
...    { cust_id: "D", ord_date: new Date("2023-06-23"), price: 23, items: [ { sku: "apple", qty: 10, price: 2.5 } ], status: "1" }
... ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("64e31cb0bbd8c3243e14f061"),
                ObjectId("64e31cb0bbd8c3243e14f062"),
                ObjectId("64e31cb0bbd8c3243e14f063"),
                ObjectId("64e31cb0bbd8c3243e14f064"),
                ObjectId("64e31cb0bbd8c3243e14f065"),
                ObjectId("64e31cb0bbd8c3243e14f066"),
                ObjectId("64e31cb0bbd8c3243e14f067"),
                ObjectId("64e31cb0bbd8c3243e14f068"),
                ObjectId("64e31cb0bbd8c3243e14f069")
        ]
}

sit_rs1:PRIMARY> db.order2.find()
{ "_id" : ObjectId("64e31b9bbbd8c3243e14f060"), "cust_id" : "A", "ord_date" : ISODate("2023-06-01T00:00:00Z"), "price" : 15, "items" : [ { "sku" : "apple", "qty" : 5, "price" : 2.5 }, { "sku" : "apples", "qty" : 5, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f061"), "cust_id" : "A", "ord_date" : ISODate("2023-06-08T00:00:00Z"), "price" : 60, "items" : [ { "sku" : "apple", "qty" : 8, "price" : 2.5 }, { "sku" : "banana", "qty" : 5, "price" : 10 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f062"), "cust_id" : "B", "ord_date" : ISODate("2023-06-08T00:00:00Z"), "price" : 55, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 }, { "sku" : "pears", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f063"), "cust_id" : "B", "ord_date" : ISODate("2023-06-18T00:00:00Z"), "price" : 26, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f064"), "cust_id" : "B", "ord_date" : ISODate("2023-06-19T00:00:00Z"), "price" : 40, "items" : [ { "sku" : "banana", "qty" : 5, "price" : 10 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f065"), "cust_id" : "C", "ord_date" : ISODate("2023-06-19T00:00:00Z"), "price" : 38, "items" : [ { "sku" : "carrots", "qty" : 10, "price" : 1 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f066"), "cust_id" : "C", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 21, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f067"), "cust_id" : "D", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 76, "items" : [ { "sku" : "banana", "qty" : 5, "price" : 10 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f068"), "cust_id" : "D", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 51, "items" : [ { "sku" : "carrots", "qty" : 5, "price" : 1 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 }, { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : ObjectId("64e31cb0bbd8c3243e14f069"), "cust_id" : "D", "ord_date" : ISODate("2023-06-23T00:00:00Z"), "price" : 23, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }

无序插入,以下尝试插入带有_id 字段 和 的多个文档 ordered: false。文档数组包含两个具有重复_id字段的文档。如下:

其中 “_id” : 2, “_id” : 6 主键冲突错误 (duplicate key error),其它文档插入成功 。

sit_rs1:PRIMARY> try {
...    db.order2.insertMany([
...    { _id: 1, cust_id: "A", ord_date: new Date("2023-06-01"), price: 15, items: [ { sku: "apple", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "1" },
...    { _id: 2, cust_id: "A", ord_date: new Date("2023-06-08"), price: 60, items: [ { sku: "apple", qty: 8, price: 2.5 }, { sku: "banana", qty: 5, price: 10 } ], status: "1" },
...    { _id: 2, cust_id: "B", ord_date: new Date("2023-06-08"), price: 55, items: [ { sku: "apple", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "1" },
...    { _id: 4, cust_id: "B", ord_date: new Date("2023-06-18"), price: 26, items: [ { sku: "apple", qty: 10, price: 2.5 } ], status: "1" },
...    { _id: 5, cust_id: "B", ord_date: new Date("2023-06-19"), price: 40, items: [ { sku: "banana", qty: 5, price: 10 } ], status: "1"},
...    { _id: 6, cust_id: "C", ord_date: new Date("2023-06-19"), price: 38, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "1" },
...    { _id: 6, cust_id: "C", ord_date: new Date("2023-06-20"), price: 21, items: [ { sku: "apple", qty: 10, price: 2.5 } ], status: "1" },
...    { _id: 8, cust_id: "D", ord_date: new Date("2023-06-20"), price: 76, items: [ { sku: "banana", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "1" },
...    { _id: 9, cust_id: "D", ord_date: new Date("2023-06-20"), price: 51, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "apple", qty: 10, price: 2.5 } ], status: "1" },
...    { _id: 10, cust_id: "D", ord_date: new Date("2023-06-23"), price: 23, items: [ { sku: "apple", qty: 10, price: 2.5 } ], status: "1" }
... ], { ordered: false });
... } catch (e) {
...    print (e);
... }
BulkWriteError({
        "writeErrors" : [
                {
                        "index" : 2,
                        "code" : 11000,
                        "errmsg" : "E11000 duplicate key error collection: test.order2 index: _id_ dup key: { _id: 2.0 }",
                        "op" : {
                                "_id" : 2,
                                "cust_id" : "B",
                                "ord_date" : ISODate("2023-06-08T00:00:00Z"),
                                "price" : 55,
                                "items" : [
                                        {
                                                "sku" : "apple",
                                                "qty" : 10,
                                                "price" : 2.5
                                        },
                                        {
                                                "sku" : "pears",
                                                "qty" : 10,
                                                "price" : 2.5
                                        }
                                ],
                                "status" : "1"
                        }
                },
                {
                        "index" : 6,
                        "code" : 11000,
                        "errmsg" : "E11000 duplicate key error collection: test.order2 index: _id_ dup key: { _id: 6.0 }",
                        "op" : {
                                "_id" : 6,
                                "cust_id" : "C",
                                "ord_date" : ISODate("2023-06-20T00:00:00Z"),
                                "price" : 21,
                                "items" : [
                                        {
                                                "sku" : "apple",
                                                "qty" : 10,
                                                "price" : 2.5
                                        }
                                ],
                                "status" : "1"
                        }
                }
        ],
        "writeConcernErrors" : [ ],
        "nInserted" : 8,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

sit_rs1:PRIMARY> db.order2.find()
{ "_id" : 1, "cust_id" : "A", "ord_date" : ISODate("2023-06-01T00:00:00Z"), "price" : 15, "items" : [ { "sku" : "apple", "qty" : 5, "price" : 2.5 }, { "sku" : "apples", "qty" : 5, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 2, "cust_id" : "A", "ord_date" : ISODate("2023-06-08T00:00:00Z"), "price" : 60, "items" : [ { "sku" : "apple", "qty" : 8, "price" : 2.5 }, { "sku" : "banana", "qty" : 5, "price" : 10 } ], "status" : "1" }
{ "_id" : 4, "cust_id" : "B", "ord_date" : ISODate("2023-06-18T00:00:00Z"), "price" : 26, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 5, "cust_id" : "B", "ord_date" : ISODate("2023-06-19T00:00:00Z"), "price" : 40, "items" : [ { "sku" : "banana", "qty" : 5, "price" : 10 } ], "status" : "1" }
{ "_id" : 6, "cust_id" : "C", "ord_date" : ISODate("2023-06-19T00:00:00Z"), "price" : 38, "items" : [ { "sku" : "carrots", "qty" : 10, "price" : 1 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 8, "cust_id" : "D", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 76, "items" : [ { "sku" : "banana", "qty" : 5, "price" : 10 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 9, "cust_id" : "D", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 51, "items" : [ { "sku" : "carrots", "qty" : 5, "price" : 1 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 }, { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 10, "cust_id" : "D", "ord_date" : ISODate("2023-06-23T00:00:00Z"), "price" : 23, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }

插入的附加方法

以下方法还可以将新文档添加到集合中:

db.collection.updateOne() 与选项一起使用时upsert: true。

db.collection.updateMany() 与选项一起使用时upsert: true。

db.collection.findAndModify() 与选项一起使用时upsert: true。

db.collection.findOneAndUpdate() 与选项一起使用时 upsert: true。

db.collection.findOneAndReplace() 与选项一起使用时 upsert: true。

db.collection.bulkWrite().

以上方法可以参考 以下的文章 :

(1)Mongodb 更新集合的方法到底有几种 (上) ?
(2)Mongodb 更新集合的方法到底有几种 (中) ?
(3)Mongodb 更新集合的方法到底有几种 (下) ?文章来源地址https://www.toymoban.com/news/detail-663866.html

到了这里,关于Mongodb 集合插入文档自动生成ObjectId的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • word文档批量生成工具(附免费软件)(按Excel表格内容自动替换内容生成文档)

    批量生成word文档是让人无比厌恶但有时又不得不做的事情。比如学校要给拟录取的学生发通知书,就可能需要批量生成一批只有“姓名”、“学院”和“专业”不同,其他内容都相同的word文档以供打印(事实上直接生成pdf是更好的选择,这个以后有心情可以弄一下)。 要实

    2024年02月11日
    浏览(47)
  • 【easytestapi,文档即测试,自动生成测试用例】

    个人编写的一个开源测试工具,GitHub - easytestapi/easytestapi: 生产力!!! 目前主要用户接口功能自动化测试,其核心思想是文档即测试。 文档是接口文档。通过我定义的标准化的接口文档,可生成测试用例,也可直接执行测试。 目前没有可视化,独立一人编写。希望有兴趣的

    2023年04月08日
    浏览(50)
  • Python自动化测试——在线生成接口文档

    目录 前言 API 文档导入生成 在项目详情页点击左侧 API 功能,进入 API 管理页面,直接点击下拉框选择导入 API  自动生成文档 通过使用接口文档工具 Eolink 演示如何自动生成文档 使用 API Factory 产品根据数据库生成 API 文档 结语 接口文档是项目开发中必需的说明文档,接口文

    2024年02月07日
    浏览(55)
  • VSCode中自动生成文档头注释和函数注释

    在编写python代码的时候,有时候需要对函数的作用、参数以及返回值进行说明,如下图所示,自己编写的话会有很多重复操作,于是希望可以使用快捷键自己生成,下面进行具体步骤的讲解。 打开VSCode,在扩展中搜索koroFileHeader,进行安装 1.在VSCode中打开设置 2.在设置中添加

    2024年02月08日
    浏览(52)
  • 【web】Fastapi自动生成接口文档(Swagger、ReDoc )

    FastAPI是流行的Python web框架,适用于开发高吞吐量API和微服务(直接支持异步编程) FastAPI的优势之一:通过提供高级抽象和自动数据模型转换,简化请求数据的处理(用户不需要手动处理原始请求数据),并能根据路由和 Pydantic 模型自动生成 OpenAPI 接口文档。 Swagger UI ReDo

    2024年02月04日
    浏览(48)
  • 【Apifox Helper】自动生成接口文档,IDEA+Apifox懒人必备

    🍊缘由 接口文档对接爽,整理起来真费脑 对于 整理API文档 ,本狗秉承偷懒为上的原则,想找一种 在IDEA中直接生成文档 的方法。 Apifox Helper 绝绝子,只需要在 IDEA中下载插件 ,无脑配置后, 文档自动生成到Apifox ,美完美解决。并且 颜值及方便程度 绝比Swagger和postman好太

    2024年02月02日
    浏览(50)
  • 读取swagger接口文档、自动生成前端ts或js代码

    平时在和后端对接时,总是要把后端swagger声明好的类型在ts中再实现一遍,写一堆interface;今天推荐一个库,可以根据swagger文档,直接生成ts 或 js代码,并且有良好的代码提示 注意:swagger文档版本需要3.0及以上 我这里快速创建下 然后创建一个 swagger.config.json 文件 配置示例

    2024年02月13日
    浏览(37)
  • 【Spring Boot】SpringBoot 优雅整合Swagger Api 自动生成文档

    Swagger 是一套 RESTful API 文档生成工具,可以方便地生成 API 文档并提供 API 调试页面。 而 Spring Boot 是一款非常优秀的 Java Web 开发框架,它可以非常方便地构建 Web 应用程序。 在本文中,我们将介绍如何使用 Swagger 以及如何在 Spring Boot 中整合 Swagger 。 首先,在 pom.xml 文件中添

    2023年04月22日
    浏览(46)
  • 【大模型】自动化问答生成:使用GPT-3.5将文档转化为问答对

    当我们需要将大段文档转化为问答对时,OpenAI的GPT-3.5模型提供了一个强大的工具。这个教程将向您展示如何编写一个Python脚本,利用GPT-3.5的能力,将文档转化为一问一答的问答对。这个流程几乎无需人工介入,能够自动获取问题并生成答案。我们将使用GPT-3.5-16k,以便处理大

    2024年02月10日
    浏览(37)
  • MongoDB文档插入

    对比增删改查 文档插入 参数说明: document:要写入的文档。 writeConcern:可选,写入策略,默认为 1,即要求确认写操作,0 是不要求。 ordered:可选,指定是否按顺序写入,默认 true,按顺序写入 db.collection.insertOne() 用于向集合插入一个新文档 语法格式如下:db.collection.inse

    2024年02月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包