MongoDB增删改查操作

本文档详细介绍了MongoDB的增删改查操作,包括如何插入单条和批量文档、查询文档、更新文档以及删除文档。讲解了各种查询条件如比较运算、逻辑运算、成员运算,还涉及到了对数组的查询、排序、分页、聚合操作等内容,是MongoDB数据库操作的实用教程。
摘要由CSDN通过智能技术生成

数据库操作:

在MongoDB中,文档集合存在数据库中。

要选择使用的数据库,请在mongo shell程序中发出 use <db> 语句

// 查看有哪些数据库
show dbs;


// 如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库。
use school;


// 查看当前所在库
db;


// 删除 先切换到要删的库下
use school;


// 删除当前库
db.dropDatabase();

集合操作:

MongoDB将文档存储在集合中。集合类似于关系数据库中的表。

如果不存在集合,则在您第一次为该集合存储数据时,MongoDB会创建该集合。

// 选择所在数据库
// 如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库。
use dbdb;

// 增加集合
// 方式一:当第一个文档插入时,集合就会被创建并包含该文档
db.student.insertOne({"name": "张三","age": 12});

// 方式二:创建一个空集合
db.student1;


// 查看数据库中有哪些集合
// 方式一:
show collections;

// 方式二:
show tables;

// 删除数据库中的集合
db.student.drop();

文档操作:

MongoDB将数据记录存储为BSON文档。BSON是​{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

 字段的值可以是任何BSON 数据类型,包括其他文档,数组和文档数组。例如,以下文档包含各种类型的值:

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               name: { first: "Alan", last: "Turing" },
               birth: new Date('Jun 23, 1912'),
               death: new Date('Jun 07, 1954'),
               contribs: [ "Turing machine", "Turing test", "Turingery" ],
               views : NumberLong(1250000)
            }

 上面的字段具有以下数据类型:

  • name包含一个包含字段firstlast的_嵌入式文档_。

  • birthdeath保留_Date_类型的值。

  • contribs拥有_字符串数组_。

  • views拥有_NumberLong_类型的值

字段名称

段名称是字符串。

文档对字段名称有以下限制:

  • 字段名称_id保留用作主键;它的值在集合中必须是唯一的,不可变的,并且可以是数组以外的任何类型。

  • 字段名称不能包含null字符。

  • 顶级字段名称不能以美元符号($)字符开头。

    否则,从MongoDB 3.6开始,服务器允许存储包含点(即.)和美元符号(即 $)的字段名称。

重要

MongoDB查询语言不能总是有效地表达对字段名称包含这些字符的文档的查询(请参阅SERVER-30575

在查询语句中添加支持之前,不推荐在字段名称中使用$.,官方MongoDB的驱动程序不支持。

BSON文档可能有多个具有相同名称的字段。但是,大多数MongoDB接口都使用不支持重复字段名称的结构(例如,哈希表)来表示MongoDB。如果需要处理具有多个同名字段的文档,请参见驱动程序文档

内部MongoDB流程创建的某些文档可能具有重复的字段,但是_任何_ MongoDB流程都_不会_向现有的用户文档添加重复的字段。

字段值限制

MongoDB 2.6至MongoDB版本,并将featureCompatibilityVersionfCV)设置为"4.0"或更早版本

对于索引集合,索引字段的值有一个最大索引键长度限制。有关详细信息,请参见Maximum Index Key Length

点符号

MongoDB使用_点符号_访问数组的元素并访问嵌入式文档的字段。

数组

要通过从零开始的索引位置指定或访问数组的元素,请将数组

名称与点(.)和从零开始的索引位置连接起来,并用引号引起来:

"<array>.<index>"

例如,给定文档中的以下字段:

{

...

contribs: [ "Turing machine", "Turing test", "Turingery" ],

...

}

要指定contribs数组中的第三个元素,请使用点符号"contribs.2"

有关查询数组的示例,请参见:

也可以看看

  • $[\]用于更新操作的所有位置运算符,

  • $[/<identifier/>] 过滤后的位置运算符,用于更新操作,

  • $ 用于更新操作的位置运算符,

  • $ 数组索引位置未知时的投影运算符

嵌入式文档

要使用点符号指定或访问嵌入式文档的字段,请将嵌入式文档名称与点(.)和字段名称连接在一起,并用引号引起来:

"<embedded document>.<field>"

例如,给定文档中的以下字段:

{

...

name: { first: "Alan", last: "Turing" },

contact: { phone: { type: "cell", number: "111-222-3333" } },

...

}

  • 要指定在字段中命名lastname字段,请使用点符号"name.last"

  • 要在字段number中的phone文档中 指定contact,请使用点号"contact.phone.number"

有关查询嵌入式文档的示例,请参见:

文件限制

文档具有以下属性:

文档大小限制

BSON文档的最大大小为16 MB。

最大文档大小有助于确保单个文档不会使用过多的RAM或在传输过程中占用过多的带宽。要存储大于最大大小的文档,MongoDB提供了GridFS API。有关GridFS的更多信息,请参见mongofiles驱动程序的文档。

文档字段顺序

除_以下情况_外,MongoDB会在执行写操作后保留文档字段的顺序:

  • _id字段始终是文档中的第一个字段。

  • 包含renaming字段名称的更新可能会导致文档中字段的重新排序。

_id字段

在MongoDB中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档省略了该_id字段,则MongoDB驱动程序会自动为该_id字段生成一个ObjectId

这也适用于通过使用upsert:true更新操作插入的文档。

_id字段具有以下行为和约束:

  • 默认情况下,MongoDB 在创建集合期间会在_id字段上创建唯一索引。

  • _id字段始终是文档中的第一个字段。如果服务器首先接收到没有该_id字段的文档,则服务器会将字段移到开头。

警告

为确保复制正常进行,请勿在_id 字段中存储BSON正则表达式类型的值。

以下是用于存储值的常用选项_id

  • 使用自然的唯一标识符(如果有)。这样可以节省空间并避免附加索引。

  • 生成一个自动递增的数字。

  • 在您的应用程序代码中生成一个UUID。为了在集合和_id 索引中更有效地存储UUID值,请将UUID存储为BSON BinData类型的值。

    在以下情况下,BinData更有效地将类型为索引的键存储在索引中:

    • 二进制子类型的值在0-7或128-135的范围内,并且

    • 字节数组的长度为:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24或32。

  • 使用驱动程序的BSON UUID工具生成UUID。请注意,驱动程序实现可能会以不同的方式实现UUID序列化和反序列化逻辑,这可能与其他驱动程序不完全兼容。有关UUID互操作性的信息,请参阅驱动程序文档

注意

大多数MongoDB驱动程序客户端将包括该_id字段,并ObjectId在将插入操作发送到MongoDB之前生成一个;但是,如果客户发送的文档中没有_id 字段,则mongod会添加该_id字段并生成ObjectId

文档结构的其他用途

除了定义数据记录外,MongoDB还在整个文档结构中使用,包括但不限于:查询过滤器更新规范文档索引规范文档

查询过滤器文档

查询过滤器文档指定确定用于选择哪些记录以进行读取,更新和删除操作的条件。

您可以使用 <field>:<value> 表达式指定相等条件和查询运算符 表达式。

{
  <field1>: <value1>,
  <field2>: { <operator>: <value> },
  ...
}

有关示例,请参见:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@明天更美好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值