ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【MongoDB学习笔记】-使用 MongoDB 进行 CRUD 操作(上)

2021-12-21 12:33:01  阅读:219  来源: 互联网

标签:name ObjectId MongoDB CRUD 笔记 文档 country lng id


作者:幻好

来源:恒生LIGHT云社区

概述

MongoDB 是一种持久化的面向文档的数据库,用于以文档的形式存储和处理数据。
在这里插入图片描述
与其他的数据库管理系统一样,MongoDB 可以通过四种基本类型的数据操作来管理数据并与数据交互:

  • C:创建操作,涉及将数据写入数据库
  • R:读取操作,查询数据库以从中检索数据
  • U:更新操作,更改数据库中已存在的数据
  • D:删除操作,从数据库中永久删除数据

以上四种操作统称为 CRUD 操作,本文主要讲解这四种操作的原理和命令等相关知识。

具体操作

连接 MongoDB Server

首先在操作前,先连接到本地或远程可使用的 MongoDB Server ,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ad1BqIIy-1640060734067)(https://developer.hs.net/storage/attachments/2021/12/12/FvAp6ovUxE6qboTq5fvNik6HM3MkoSDBuUEXkPHK_thumb.png “4132”)]

连接 MongoDB 数据库成功后,就可以开始创建新文档(documents)。

创建文档

首先先重点介绍如何在 MongoDB 中创建数据文档(documents

比如创建一个东方明珠景点对象,可能相关信息有所在国家,城市,坐标等:

{
    "name": "东方明珠",
    "country": "中国",
    "city": "上海",
    "location": {
        "lat": 121.537,
        "lng": 31.258
    }
}

MongoDB 的文档是用 BSON 编写的, BSONJSON 的二进制形式,是方便可读的数据格式。 BSONJSON 文档中的所有数据都表示为采用 field: value 形式的字段和值对。

该文档由四个字段组成,首先是景点的名称,其次是城市和国家。所有这三个字段都包含字符串。最后一个字段坐标:location,是一个嵌套文档,详细说明了景点的位置坐标。

insertOne

使用 insertOne 方法将此文档插入到名为 spots 的新集合中。顾名思义,insertOne 用于创建单个文档,而不是一次创建多个文档。

在命令行中,运行以下指令:

db.spots.insertOne(
    {
        "name": "东方明珠",
        "country": "中国",
        "city": "上海",
        "location": {
            "lat": 121.537,
            "lng": 31.258
        }
    }
)

# 输出
{
    "acknowledged" : true,
    "insertedId" : ObjectId("61b5d4963d2fc20a8483df1a")
}

在执行此 insertOne 方法之前,需要保证未创建 spots 集合。

通过执行这个示例 insertOne() 方法,它不仅会将文档插入到集合中,还会自动创建集合。该操作的输出将通知您它已成功执行,并提供它为新文档自动生成的 ObjectId:61b5d4963d2fc20a8483df1a

在 MongoDB 中,集合中的每个文档都必须有一个唯一的 _id 字段作为主键,所以 _id 字段是唯一的。如果新文档插入时为设置 _id 字段,MongoDB 将自动生成一个对象标识符(以 ObjectId 对象的形式)作为 _id 字段的值。

在文档创建后,可以通过下面命令检查 spots 集合中的对象计数来验证文档是否已插入:

> db.spots.count()

# 输出:
1

insertMany

如果需要创建多个文档,如果通过 insertOne 方法一个一个地插入文档,会变的非常麻烦。所以, MongoDB 提供了 insertMany 方法,您可以使用该方法在单个操作中插入多个文档。

运行以下示例命令,该命令使用 insertMany 方法将新的景点信息插入 spots 集合中:

db.spots.insertMany([
  {"name": "故宫", "city": "北京", "country": "中国", "gps": { "lat": 116.403, "lng": 39.924 }},
  {"name": "长城", "city": "北京", "country": "中国", "gps": { "lat": 106.384, "lng": 39.031 }},
  {"name": "白宫", "city": "华盛顿", "country": "美国", "gps": { "lat": 116.652, "lng": 40.121 }},
  {"name": "伦敦之眼", "city": "伦敦", "country": "英国", "gps": { "lat": 116.348, "lng": 34.430 }}
])

请注意围绕六个文档的方括号 ([ ]),这些括号表示文档数组。在方括号内,多个对象可以一个接一个出现,以逗号分隔。在 MongoDB 方法需要多个对象的情况下,可以像这样以数组的形式提供对象列表。

MongoDB 将响应多个对象标识符,每个新插入的对象一个:

# 输出
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("61b5d7ba3d2fc20a8483df1b"),
                ObjectId("61b5d7ba3d2fc20a8483df1c"),
                ObjectId("61b5d7ba3d2fc20a8483df1d"),
                ObjectId("61b5d7ba3d2fc20a8483df1e")
        ]
}

您可以通过检查 spots 集合中的对象个数,来验证文档是否已插入:

> db.spots.count()
# 输出:
5

查询文档

通过创建操作,spots 集合中存储了一些文档,可以查询数据库以检索这些文档并读取它们的数据。此步骤首先概述如何查询给定集合中的所有文档,然后描述如何使用过滤器缩小检索到的文档列表。

find

完成上一步后,可以使用 find() 方法通过单个操作检索所有文档:

> db.spots.find()

# 输出:
{ "_id" : ObjectId("61b5d4963d2fc20a8483df1a"), "name" : "东方明珠", "country" : "中国", "city" : "上海", "location" : { "lat" : 121.537, "lng" : 31.258 } }
{ "_id" : ObjectId("61b5d7ba3d2fc20a8483df1b"), "name" : "故宫", "city" : "北京", "country" : "中国", "gps" : { "lat" : 116.403, "lng" : 39.924 } }
{ "_id" : ObjectId("61b5d7ba3d2fc20a8483df1c"), "name" : "长城", "city" : "北京", "country" : "中国", "gps" : { "lat" : 106.384, "lng" : 39.031 } }
{ "_id" : ObjectId("61b5d7ba3d2fc20a8483df1d"), "name" : "白宫", "city" : "华盛顿", "country" : "美国", "gps" : { "lat" : 116.652, "lng" : 40.121 } }
{ "_id" : ObjectId("61b5d7ba3d2fc20a8483df1e"), "name" : "伦敦之眼", "city" : "伦敦", "country" : "英国", "gps" : { "lat" : 116.348, "lng" : 34.43 } }

此方法在不带任何参数的情况下使用时,不应用任何过滤并要求 MongoDB 返回指定集合中可用的所有对象: spots。

需要注意,这些对象中的每一个都有一个您未定义的 _id 属性。如前所述,_id 字段用作它们各自文档的主键,并且是在上一步中运行 insertMany 方法时自动创建的。

为了使 find() 方法的输出更具可读性,您可以使用其 pretty 方法打印功能,如下所示:

db.spots.find().pretty()

# 输出:
{
        "_id" : ObjectId("61b5d4963d2fc20a8483df1a"),
        "name" : "东方明珠",
        "country" : "中国",
        "city" : "上海",
        "location" : {
                "lat" : 121.537,
                "lng" : 31.258
        }
}
{
        "_id" : ObjectId("61b5d7ba3d2fc20a8483df1b"),
        "name" : "故宫",
        "city" : "北京",
        "country" : "中国",
        "gps" : {
                "lat" : 116.403,
                "lng" : 39.924
        }
}
以下 find() 方法通过接受查询过滤器文档作为参数来返回单个对象。查询过滤器文档遵循与插入到集合中的文档相同的结构,由字段和值组成,但它们用于过滤查询结果。

使用的查询过滤器文档包括 _id 字段,以对象标识符作为值,查询指定的对象:

```shell
db.spots.find({"_id": ObjectId("61b5d4963d2fc20a8483df1a")}).pretty()

# 输出:
{
        "_id" : ObjectId("61b5d4963d2fc20a8483df1a"),
        "name" : "东方明珠",
        "country" : "中国",
        "city" : "上海",
        "location" : {
                "lat" : 121.537,
                "lng" : 31.258
        }
}

也可以在文档中通过其他字段,进行有效过滤:

db.spots.find({"country": "中国"}).pretty()

# 输出:
{
        "_id" : ObjectId("61b5d4963d2fc20a8483df1a"),
        "name" : "东方明珠",
        "country" : "中国",
        "city" : "上海",
        "location" : {
                "lat" : 121.537,
                "lng" : 31.258
        }
}
{
        "_id" : ObjectId("61b5d7ba3d2fc20a8483df1b"),
        "name" : "故宫",
        "city" : "北京",
        "country" : "中国",
        "gps" : {
                "lat" : 116.403,
                "lng" : 39.924
        }
}
{
        "_id" : ObjectId("61b5d7ba3d2fc20a8483df1c"),
        "name" : "长城",
        "city" : "北京",
        "country" : "中国",
        "gps" : {
                "lat" : 106.384,
                "lng" : 39.031
        }
}

查询过滤器文档非常强大和灵活,能够帮助我们高效的查询数据。

总结

MongoDB 提供了一个强大的查询系统,允许根据复杂的标准精确选择感兴趣的文档,后续会继续对于MongoDB的使用技巧进行详细分享。

通过学习本文笔记,能够使我们对mongo的基本CRUD操作,快速入门,当然学习完之后还需自己动手实践。


想向技术大佬们多多取经?开发中遇到的问题何处探讨?如何获取金融科技海量资源?

恒生LIGHT云社区,由恒生电子搭建的金融科技专业社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。

扫描下方小程序二维码,加入我们!

标签:name,ObjectId,MongoDB,CRUD,笔记,文档,country,lng,id
来源: https://blog.csdn.net/weixin_44433834/article/details/122059376

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有