• MongoDB教程11-MongoDB插入文档


    这里将向大家介绍如何将数据插入到 MongoDB 的集合中。

    文档的数据结构和 JSON 基本一样。

    所有存储在集合中的数据都是 BSON 格式。

    BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

    文档是 MongoDB 中存储的基本单元,是一组有序的键值对集合。文档中存储的文档键的格式必须是符合 UTF-8 标准的字符串,同时要遵循以下注意事项:

    • 不能包含字符(空字符),因为这个字符表示键的结束;
    • 不能包含$.,因为.$是被保留的,只能在特定环境下使用;
    • 键名区分大小写;
    • 键的值区分类型(如字符串和整数等);
    • 键不能重复,在一条文档里起唯一的作用。

    注意,以上所有命名规范必须符合 UTF-8 标准的字符串,文档的键值对是有顺序的,相同的键值对如果有不同顺序,也是不同的文档。

    例1:以下两组文档是不同的,因为值的类型不同。

    {"recommend":"5"}
    {"recommend":5}

    例2:以下两组文档也是不同的,因为键名是区分大小写的。

    {"Recommend":"5"}
    {"recommend":"5"}

    例3:以下两组文档也是不同的,因为键值对有不同顺序。

    {"name":"tom", "age":10}
    {"age":10, "name":"tom"}

    MongoDB 插入文档

    要将数据插入 MongoDB 集合中,可以使用 MongoDB 的 insert() 方法,同时 MongoDB 针对插入一条还是多条数据,提供了更可靠的 insertOne() 和 insertMany() 方法。

    MongoDB 向集合里插入记录时,无须事先对数据存储结构进行定义。如果待插入的集合不存在,则插入操作会默认创建集合。

    在 MongoDB 中,插入操作以单个集合为目标,MongoDB 中的所有写入操作都是单个文档级别的原子操作。

    向集合中插入数据的语法如下:

    db.collection.insert(
    <document or array of documents>,
    {
        writeConcern: <document>,    //可选字段
        ordered: <boolean>    //可选字段
        }
    )

    collection 为集合名,insert() 为插入文档命令

    参数说明:

    • <document or array of documents> 参数表示可设置插入一条或多条文档。
    • writeConcern:<document> 参数表示自定义写出错的级别,是一种出错捕捉机制, 默认为 1,即要求确认写操作,0 是不要求。
    • ordered:<boolean> 是可选的,默认为 true。
      • 如果为 true,在数组中执行文档的有序插入,并且如果其中一个文档发生错误,MongoDB 将返回而不处理数组中的其余文档;
      • 如果为 false,则执行无序插入,若其中一个文档发生错误,则忽略错误,继续处理数组中的其余文档。

    插入不指定 _id 字段的文档的代码如下:

    > db.myColl3.insert({"title":"MongoDB教程",    // 命令没结束, 回车可以换行
    ... "info":"MongoDB 是一个 Nosql 数据库"
    ... })
    WriteResult({ "nInserted" : 1 })

    myColl3集合如果不存在,自动创建并插入文档...

    在插入期间,mongod 将创建 _id 字段并为其分配唯一的 Objectld 值,这里的 mongod 是一个 MongoDB 服务器的实例,也就是 MongoDB 服务驻扎在计算机上的进程。

    查看集合文档的代码如下:

    > db.myColl3.find()
    { "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }

    这些 Objectld 值与执行时操作时的机器和时间有关,因此,用户执行这段命令后的返回值与示例中的值是不同的。

    插入指定 _id 字段的文档,值 _id 必须在集合中唯一,以避免重复键错误,代码如下:

    > db.myColl3.insert({    // 命令没结束, 回车换行
    ... "_id":1,
    ... "title":"insert指定_id",
    ... "info":"MongoDB插入数据"
    ... })
    WriteResult({ "nInserted" : 1 })
    > db.myColl3.find()
    { "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
    { "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }

    可以看到新插入文档的 id 值为设置的 id 值1。如果插入指定_id重复, 如下:

    > db.myColl3.insert({
    ... "_id":1
    ... })
    WriteResult({
            "nInserted" : 0,
            "writeError" : {
                    "code" : 11000,
                    "errmsg" : "E11000 duplicate key error collection: myDB.myColl3 index: _id_ dup key: { _id: 1.0 }"
            }
    })

    插入的多个文档无须具有相同的字段。例如,下面代码中的第一个文档包含一个 _id 字段和一个 type 字段,第二个和第三个文档不包含 _id 字段。因此,在插入过程中,MongoDB 将会为第二个和第三个文档创建默认 _id 字段,代码如下:

    > db.myColl3.insert([  // 一次插入多个文档, 使用[{},{}...]的格式
    ... {"_id":2, "name":"张三", "age":18, "address":"中国"},
    ... {"name":"李四", "age":19},
    ... {"info":"Hello", "car":"buick"}
    ... ])
    BulkWriteResult({
            "writeErrors" : [ ],
            "writeConcernErrors" : [ ],
            "nInserted" : 3,
            "nUpserted" : 0,
            "nMatched" : 0,
            "nModified" : 0,
            "nRemoved" : 0,
            "upserted" : [ ]
    })

    查询验证,可以看到在 _id 插入期间,系统自动为第二、第三个文档创建了字段,代码如下:

    > db.myColl3.find()
    { "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
    { "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }
    { "_id" : 2, "name" : "张三", "age" : 18, "address" : "中国" }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }

    注意插入多条数据使用[{}, {}...]的格式

    我们也可以将数据定义为一个变量,如下所示:

    > document=({"name":"test", "age":66})
    { "name" : "test", "age" : 66 }
    >
    > db.myColl3.insert(document)
    WriteResult({ "nInserted" : 1 })
    >
    > db.myColl3.find()
    { "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
    { "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }
    { "_id" : 2, "name" : "张三", "age" : 18, "address" : "中国" }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }
    { "_id" : ObjectId("5f4f510ae8b8099c8e7dbecc"), "name" : "test", "age" : 66 }  // document变量定义的数据

    有序地插入多条文档的代码如下:

    > db.myColl3.insert([
            {_id:10, item:"pen", price:"20" },
            {_id:12, item:"redpen", price: "30" },
            {_id:11, item:"bluepen", price: "40" }
        ],
        {ordered:true}
    )

    在设置 ordered:true 时,插入的数据是有序的,如果存在某条待插入文档和集合的某文档 _id 相同的情况,_id 相同的文档与后续文档都将不再插入。在设置 ordered:false 时,除了出错记录(包括 _id 重复)外其他的记录继续插入。

    MongoDB 3.2 更新后新增以下两种新的文档插入命令如下:

    db.collection.insertone ()
    db.collection.insertMany()

    使用 insertOne() 插入一条文档的代码如下:

    db.myColl.iusertone( { item: "card", qty: 15 } );

    使用 insertMany() 插入多条文档的代码如下:

    db.myColl.insertMany([
        { item: "card", qty: 15 },
        { item: "envelope", qty: 20 },
        { item: "stamps", qty:30 }
    ]);
  • 相关阅读:
    【流媒体】Nginx+nginxhttpflvmodule流媒体+鉴权
    【Linux】Tess4j识别pdf报错libgs.so无法加载
    【Java】tess4j文字识别
    【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理
    【Spring专场】「AOP容器」不看源码就带你认识核心流程以及运作原理
    【Spring专场】「IOC容器」不看源码就带你认识核心流程以及运作原理
    【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—CuratorFramework(基础篇)
    🍃【Spring专题】「技术原理」为大家介绍一下Spring中的Ant路径匹配工具组件AntPathMatcher
    Wireshark安装入门及抓取网站用户名密码
    手把手教你用 wireshark 抓包
  • 原文地址:https://www.cnblogs.com/no-celery/p/13602240.html
Copyright © 2020-2023  润新知