MongoDB学习(java版)

news2024/10/3 2:19:49

MongoDB概述

结构化数据库

​ 结构化数据库是一种使用结构化查询语言(SQL)进行管理和操作的数据库,它们的数据存储方式是基于表格和列的。结构化数据库要求数据预先定义数据模式和结构,然后才能存储和查询数据。结构化数据库通常具有以下特点:

  1. 数据预定义:在存储数据之前,需要先定义数据结构和数据类型。这些定义通常存储在数据库的元数据中,并用于确保数据库中的数据一致性和完整性。

  2. 数据之间的关系:结构化数据库使用表格来存储数据,并且通常有多个表格之间的关系。通过在表格之间建立外键关系,可以在查询时轻松地检索相关数据。

  3. SQL支持:结构化数据库使用SQL进行管理和查询。SQL是一种标准化的查询语言,能够使用户轻松地检索和操作数据。

  4. ACID事务支持:结构化数据库支持ACID事务,确保数据的一致性和完整性。

    常见的结构化数据库包括MySQL、Oracle、SQL Server等。结构化数据库主要用于事务性应用程序和数据处理应用程序,例如企业资源计划(ERP)和客户关系管理(CRM)系统。这些应用程序需要处理结构化数据,并且需要确保数据的一致性和完整性。

非结构化数据库

​ 非结构化数据库是一种没有预定义数据结构的数据库,它们的数据存储方式是基于文档、键值对或图形的,不同的非结构化数据库使用的数据存储方式可能不同。非结构化数据库不需要事先定义数据结构,它们的数据可以动态添加和删除,非常适合存储大量复杂和多层次的数据。
​ 非结构化数据库的特点如下:

  1. 数据灵活性:非结构化数据库的数据存储格式更灵活,可以存储各种类型的数据,包括文本、图像、音频、视频等。

  2. 高性能:非结构化数据库通常能够更快地访问和处理数据,因为它们的数据存储方式更为灵活,使得查询效率更高。

  3. 可扩展性:非结构化数据库通常可以更好地扩展,因为它们不需要预定义表结构。

  4. 没有固定查询语言:非结构化数据库没有像SQL一样的标准化查询语言,而是使用API和查询语句来访问和操作数据。

    非结构化数据库可以分为几种不同的类型,包括:

  5. 文档数据库:文档数据库存储的是基于文档的数据,例如JSON或XML格式。文档数据库的查询通常是基于键值对的。常见的文档数据库包括MongoDB、Couchbase、RavenDB等。

  6. 键值数据库:键值数据库存储的是基于键值对的数据,通常用于缓存和存储大量的简单数据。常见的键值数据库包括Redis、Amazon DynamoDB、Riak等。

  7. 列式数据库:列式数据库将数据存储在列中,而不是行中,这使得它们能够快速地查询和分析大量数据。常见的列式数据库包括Apache Cassandra、HBase等。

  8. 图形数据库:图形数据库存储的是基于图形结构的数据,通常用于存储和查询关系和连接。常见的图形数据库包括Neo4j、ArangoDB等。

    以下是常见的几种 NoSQL 数据库之间的对比:

    特性MongoDBCassandraRedisCouchbaseHBase
    数据模型文档型列族型键值型文档型列族型
    支持 ACID 事务支持仅在单独的分区上支持不支持支持不支持
    数据分布支持分片支持分布式集群不支持分片支持分片支持分布式集群
    备份与恢复支持备份和恢复支持增量备份和快照支持备份和恢复支持备份和恢复支持备份和恢复
    索引支持二级索引支持二级索引支持多种索引支持二级索引支持二级索引
    适合场景大数据量、高性能读写分布式、高吞吐量写入内存缓存、高速读写强一致性、高可用性适合实时读写大规模数据

结构化数据库和非结构化数据库

以下是结构化数据库和非结构化数据库的对比表格:

特性结构化数据库非结构化数据库
数据模型关系型模型,基于表格的结构非关系型模型,没有固定的结构,可以是文档、键值、图形等
数据存储通常使用 SQL 语言存储和检索数据不使用 SQL 语言存储和检索数据
数据规模适合处理小规模、高度结构化的数据适合处理大规模、非结构化的数据
数据一致性强一致性,可以保证数据的完整性和准确性最终一致性,数据的一致性和准确性不能保证
数据处理常用于在线事务处理(OLTP)场景常用于在线分析处理(OLAP)场景
可扩展性通常采用垂直扩展(增加更强大的硬件)通常采用水平扩展(增加更多的节点)
代表性数据库MySQL、Oracle、SQL ServerMongoDB、Cassandra、Redis

MongoDB介绍

​ MongoDB是一种流行的文档型数据库管理系统,它是一个开源、跨平台的数据库系统,支持在分布式集群上进行横向扩展。MongoDB使用类似于JSON的BSON(二进制JSON)格式来存储数据,它支持复杂的查询和索引,可以处理大量数据并具有高可用性和自动分片等特性。MongoDB的灵活性和可扩展性使得它在各种不同的应用场景中被广泛使用,如Web应用程序、大数据、物联网等。

​ MongoDB的主要特点如下:

  1. 数据模型灵活:MongoDB使用文档型数据库模型,可以存储各种类型的数据,如文本、图像、视频、音频等,且可以随时添加、删除、修改数据结构,极大地提高了开发效率。
  2. 横向扩展性强:MongoDB支持在分布式集群上进行横向扩展,通过将数据和负载分散到多台服务器上,提高了系统的可用性和吞吐量。
  3. 高性能:MongoDB通过内存映射和其他技术实现了高效的数据访问和查询,能够快速地处理大量数据。
  4. 高可用性:MongoDB通过副本集和分片技术实现了高可用性和容错性,即使某台服务器出现故障,整个系统也能够继续正常运行。
  5. 开源和社区支持:MongoDB是一个完全开源的项目,拥有庞大的社区支持和开发者基础,使得它能够快速地适应新的技术和应用场景。

安装与配置

下载安装包

MongoDB官网的下载页面上下载本地版本的在这里插入图片描述
MongoDB。以下是下载MongoDB本地版本的步骤:

打开MongoDB官网https://www.mongodb.com/try/download/community 点击“Download”进入下载页面。

  1. 在下载页面中,选择适合的操作系统(如Windows、macOS或Linux)和MongoDB的版本号。如果不确定应该选择哪个版本,可以选择最新版本。

  2. 选择需要下载的版本后,会看到两个可用的下载选项:MSI和ZIP。如果使用的是Windows操作系统,建议下载MSI版本。如果使用的是Linux或macOS操作系统,建议下载ZIP版本。

安装

Windows
  • msi
    1. 双击安装包mongodb-windows-x86_64-4.4.4-signed.msi进行安装,根据提示完成安装过程。

    2. 将MongoDB的安装目录添加到系统环境变量中。默认情况下,MongoDB会被安装到C:\Program Files\MongoDB\Server\<version>目录下,其中<version>是您所安装的MongoDB版本号。您可以按以下步骤将MongoDB的安装目录添加到系统环境变量中:

      a. 右键单击“此电脑”(或“我的电脑”),选择“属性”。

      b. 点击“高级系统设置”。

      c. 在“系统属性”窗口中,点击“环境变量”。

      d. 在“环境变量”窗口中,找到“系统变量”下的“Path”变量,双击打开。

      e. 在“编辑环境变量”窗口中,点击“新建”。

      f. 输入MongoDB的安装路径,例如C:\Program Files\MongoDB\Server\<version>\bin,然后点击“确定”。

    3. 打开命令提示符,输入以下命令以启动MongoDB:

    mongod --dbpath C:\mongodb\data\db
    

    其中,--dbpath参数指定MongoDB数据文件的存储路径。如果未指定该参数,则MongoDB会默认使用C:\data\db目录作为数据文件存储路径。

  • zip
    1. 下载MongoDB的Zip格式包,例如mongodb-win32-x86_64-4.4.4.zip

    2. 解压MongoDB的Zip格式包到一个目录,例如C:\mongodb

    3. 将MongoDB的安装目录添加到系统环境变量中。您可以按以下步骤将MongoDB的安装目录添加到系统环境变量中:

      a. 右键单击“此电脑”(或“我的电脑”),选择“属性”。

      b. 点击“高级系统设置”。

      c. 在“系统属性”窗口中,点击“环境变量”。

      d. 在“环境变量”窗口中,找到“系统变量”下的“Path”变量,双击打开。

      e. 在“编辑环境变量”窗口中,点击“新建”。

      f. 输入MongoDB的安装路径,例如C:\mongodb\bin,然后点击“确定”。

    4. 打开命令提示符,输入以下命令以启动MongoDB:

mongod --dbpath C:\mongodb\data\db

其中,--dbpath参数指定MongoDB数据文件的存储路径。如果未指定该参数,则MongoDB会默认使用C:\data\db目录作为数据文件存储路径。

Linux
  1. 打开终端,并切换到包含MongoDB压缩包的目录。
  2. 使用以下命令解压MongoDB压缩包:
tar -zxvf mongodb-linux-x86_64-<version>.tgz

其中<version>是您下载的MongoDB版本号。

  1. 将解压后的文件夹移动到指定位置。例如,将MongoDB文件夹移动到/usr/local/目录下,使用以下命令:
sudo mv mongodb-linux-x86_64-<version> /usr/local/mongodb
  1. 配置环境变量。打开~/.bashrc~/.bash_profile文件,并添加以下行:
export PATH=/usr/local/mongodb/bin:$PATH
  1. 保存并关闭文件,然后使用以下命令使环境变量生效:
source ~/.bashrc
  1. 启动MongoDB。使用以下命令启动MongoDB:
mongod --dbpath \home\data\mongodb

Mongodb 配置项

下面是一份mongod.conf的示例代码,包括了各个配置项的详细说明:

yamlCopy code# mongod.conf

# 系统日志配置
systemLog:
  destination: file     # 日志输出到文件
  path: /var/log/mongodb/mongod.log   # 日志文件路径
  logAppend: true   # 采用追加模式
  quiet: false      # 关闭安静模式,开启详细日志输出

# 网络配置
net:
  port: 27017   # 监听的端口号
  bindIp: 127.0.0.1  # 监听的IP地址,默认为所有可用IP地址

# 存储引擎配置
storage:
  dbPath: /var/lib/mongodb   # 数据文件存储路径
  engine: wiredTiger         # 存储引擎

# 进程管理配置
processManagement:
  fork: true    # 是否在后台运行

# 复制集配置
replication:
  replSetName: rs0   # 复制集名称

# 安全认证配置
security:
  authorization: enabled   # 启用认证机制

在这个示例中,我们配置了系统日志、网络、存储引擎、进程管理、复制集和安全认证等多个方面的配置项。具体说明如下:

  • 系统日志配置:将日志输出到文件,并指定了日志文件的存储路径。我们采用追加模式,并关闭了安静模式,以便输出详细的日志信息。
  • 网络配置:指定了MongoDB监听的端口号为27017,并默认监听本地地址127.0.0.1。
  • 存储引擎配置:指定了数据文件的存储路径为/var/lib/mongodb,并使用了wiredTiger存储引擎。
  • 进程管理配置:将MongoDB配置为后台运行。
  • 复制集配置:指定了复制集的名称为rs0
  • 安全认证配置:启用了认证机制,以增强MongoDB的安全性。

具体的配置项根据实际需求进行修改。修改mongod.conf文件后,需要重启MongoDB才能使新的配置生效。

数据结构

数据库(Database)

数据库(Database)是 MongoDB 的最高级别的数据存储单位,可以包含多个集合(Collection),类似于关系型数据库中的数据库(Database)。

数据结构描述
集合(Collection)每个数据库可以包含多个集合,类似Mysql的表
文档(Document)每个集合包含多个文档,文档是 MongoDB 的最小数据单元
字段(Field)每个文档包含多个字段,类似于关系型数据库中的列
  • 集合(Collection):

    在 MongoDB 中,集合(Collection)是一组文档(Document)的无序集合。与关系型数据库中的表(Table)相比,集合不需要提前定义结构(Schema),也不需要定义表之间的关系。在集合中可以存储各种不同结构的文档,这使得 MongoDB 数据模型非常灵活,适用于各种类型的应用场景。

    MongoDB 中的集合类似于关系型数据库中的表,但有以下区别:

    • 集合不需要提前定义结构,文档可以有不同的字段和值。
    • 集合是动态的,即当第一个文档插入时自动创建集合,不需要提前创建。
    • 集合中的文档不需要有相同的字段,也不需要遵循相同的数据类型。
    • 集合是基于文档的,而不是基于行的。
  • 文档(Document):

    文档(Document)是数据的基本单元,类似于关系型数据库中的行(Row)。文档是一个由字段和值组成的键值对(Key-Value Pair),可以存储各种不同的数据类型,例如字符串、整数、浮点数、布尔值、数组、日期等等。

    与关系型数据库中的行相比,文档的结构非常灵活,可以随时添加或删除字段,也可以包含嵌套的文档和数组。这种灵活性使得 MongoDB 在处理非结构化数据时非常方便。

  • 字段(Field):

    在 MongoDB 中,一个文档(Document)就是一个数据记录,每个文档都由一个或多个字段(Field)组成。字段是文档中的最小单位,每个字段都包含一个键值对,键是字符串类型的字段名称,值可以是任何 BSON 数据类型,例如字符串、数字、布尔值、数组、日期时间等。

    以下是 MongoDB 支持的常见数据类型以及它们的描述:

    数据类型描述
    String存储文本数据,最大长度为 16 MB
    Integer存储整数,包括 32 位整数和 64 位整数
    Double存储浮点数
    Boolean存储布尔值
    Object存储嵌套文档
    Array存储数组
    Date存储日期和时间
    ObjectId存储文档的唯一标识符
    Binary存储二进制数据
    Regular Expression存储正则表达式

    ​ 除了上述数据类型外,MongoDB 还支持一些高级数据类型,例如 GeoJSON、MinKey、MaxKey 等。这些数据类型在特定场景下会非常有用。

    在 MongoDB 中,文档的字段类型是动态的,也就是说,在同一个集合中,不同的文档可以拥有不同的字段,而且这些字段的类型可以不同。这种灵活性使得 MongoDB 非常适合存储非结构化数据和半结构化数据。同时,这也带来了一些挑战,例如需要进行数据验证和数据一致性的管理。

基本操作

Shell操作

MongoDB 4.4版本之前使用mongo来操作数据库,后期版本使用mongosh 。

mongosh 是 MongoDB 官方推出的命令行工具,支持 MongoDB 4.4 及更高版本,提供了更好的交互体验和更多的功能,例如语法高亮、自动完成、内置实用程序等。

mongosh下载地址https://www.mongodb.com/try/download/shell,下载完成之后解压后,保存到上面配置的安装目录下,或者按照自己的想法放到任意位置。

  1. 连接 MongoDB 数据库

使用 mongosh 命令行工具连接 MongoDB 数据库,格式为:

mongosh mongodb://<username>:<password>@<host>/<database>

其中:

  • <username>:用户名
  • <password>:密码
  • <host>:主机名或 IP 地址
  • <database>:要连接的数据库名称

例如,连接本地 MongoDB 数据库可以使用以下命令:

mongosh mongodb://localhost/test
#或者直接使用
mongosh
  1. 查看所有数据库

使用以下命令可以查看 MongoDB 中的所有数据库:

show databases
# 或者
show dbs
  1. 切换数据库

使用以下命令可以切换当前数据库:

use <database>

例如,切换到名为 mydb 的数据库:

use mydb
  1. 查看当前数据库中的所有集合

使用以下命令可以查看当前数据库中的所有集合:

show collections
  1. 插入数据insertOne / insertMany

使用以下命令可以向集合中插入一条文档:

db.<collection>.insertOne(<document>)

其中:

  • <collection>:集合名称
  • <document>:要插入的文档数据,格式为 JSON 对象

例如,向名为 users 的集合中插入一条文档:

db.users.insertOne({ name: 'Alice', age: 30 })

mongosh 中进行批量插入数据可以使用 insertMany() 方法。例如,插入多个文档到 test 数据库中的 students 集合中:

db.users.insertMany([
   { name: "Alice", age: 20, gender: "female" },
   { name: "Bob", age: 21, gender: "male" },
   { name: "Charlie", age: 19, gender: "male" }
])

上述代码将会向 users集合中插入三个文档,每个文档都包含 nameagegender 三个字段。insertMany() 方法可以接受一个包含多个文档的数组作为参数,并且会返回一个包含插入结果的对象。

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("6405aa49d335c2829403f6a2"),
    '1': ObjectId("6405aa49d335c2829403f6a3"),
    '2': ObjectId("6405aa49d335c2829403f6a4")
  }
}
  1. 查询数据

使用以下命令可以查询集合中的文档:

db.<collection>.find(<query>)

其中:

  • <collection>:集合名称
  • <query>:查询条件,格式为 JSON 对象

例如,查询名为 Alice 的文档:

db.users.find({ name: 'Alice' })
db.users.find({ })
[
  { _id: ObjectId("6405a63ed335c2829403f6a1"), name: 'Alice', age: 30 },
  {
    _id: ObjectId("6405aa49d335c2829403f6a2"),
    name: 'Alice',
    age: 20,
    gender: 'female'
  },
  {
    _id: ObjectId("6405aa49d335c2829403f6a3"),
    name: 'Bob',
    age: 21,
    gender: 'male'
  },
  {
    _id: ObjectId("6405aa49d335c2829403f6a4"),
    name: 'Charlie',
    age: 19,
    gender: 'male'
  }
]
  1. 更新数据updateOne/updataMany

使用以下命令可以更新集合中的文档:

updateOne() 是 MongoDB 提供的更新单个文档的方法。

语法:

db.collection.updateOne(
   <filter>,
   <update>,
   {
      upsert: <boolean>,
      writeConcern: <document>,
      collation: <document>
   }
)

参数说明:

  • <filter>:查询需要更新的文档的筛选条件。

    常用的筛选符号如下:

    • $eq: 匹配等于指定值的文档。
    • $ne: 匹配不等于指定值的文档。
    • $gt: 匹配大于指定值的文档。
    • $gte: 匹配大于或等于指定值的文档。
    • $lt: 匹配小于指定值的文档。
    • $lte: 匹配小于或等于指定值的文档。
    • $in: 匹配指定数组中任意值的文档。
    • $nin: 不匹配指定数组中任意值的文档。
    • $and: 逻辑与,同时满足多个条件。
    • $or: 逻辑或,满足多个条件之一。
    • $not: 反转筛选条件,匹配不符合条件的文档。
    • $nor: 逻辑非或,不满足多个条件之一。
  • <update>:指定如何更新文档。

  • upsert:可选,如果设置为 true,当查询条件的文档不存在时,会创建一个新文档。默认为 false

  • writeConcern:可选,指定写入操作的写入安全性。

  • collation:可选,指定语言特定的比较规则。

例如,将名为 Alice 的文档的年龄更新为 31

db.users.updateOne({ name: 'Alice' }, { $set: { age: 31 } })

updateMany()是MongoDB用于更新多个文档的方法,可以将一个或多个文档的字段值更新为指定的值,或者使用更新操作符进行更新。

语法:

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

参数说明:

  • filter:指定更新文档的条件,与find方法的query参数类似。

  • update:指定要更新的文档字段及值,可以使用更新操作符。

  • upsert:可选,如果设置为true,表示如果没有符合条件的文档则插入新的文档,默认为false

  • writeConcern:可选,指定写入操作的安全级别。

  • collation:可选,指定对文档进行排序、大小写不敏感的比较和字符映射的规则。

  • arrayFilters:可选,如果更新的文档中包含嵌套数组,则使用该参数指定更新哪些子文档。

    update 更新操作符:

    1. $set:用于指定更新字段及其值。
    2. $unset:用于从文档中删除一个或多个字段。
    3. $inc:用于增加或减少一个数字型字段的值。
    4. $push:用于将一个值添加到数组字段中。
    5. $addToSet:用于将一个唯一的值添加到数组字段中。
    6. $pop:用于从数组字段中删除第一个或最后一个元素。
    7. $pull:用于从数组字段中删除指定的元素。
    8. $rename:用于重命名一个字段。

示例:

将集合users中年龄为25岁的用户的姓名改为“Tom”:

db.users.updateMany(
   { age: 25 },
   { $set: { name: "Tom" } }
)

将集合users中年龄为25岁的用户的年龄加1:

db.users.updateMany(
   { age: 25 },
   { $inc: { age: 1 } }
)

将集合users中所有用户的年龄减1:

db.users.updateMany(
   {},
   { $inc: { age: -1 } }
)
  1. 删除数据

deleteOne(filter, options) 方法删除集合中匹配过滤条件的单个文档。如果多个文档匹配,只删除第一个匹配的文档。

db.collection.deleteOne(
   <filter>,
   {
     writeConcern: <document>,
     collation: <document>
   }
)
  • <filter>:(可选)删除条件,表示要删除的文档。
  • writeConcern:(可选)写入操作的写入安全性级别。
  • collation:(可选)指定要用于字符串比较的规则。

示例:

db.users.deleteOne({name: "John"})

deleteMany(filter, options) 方法从集合中删除匹配过滤条件的多个文档。

db.collection.deleteMany(
   <filter>,
   {
     writeConcern: <document>,
     collation: <document>
   }
)
  • <filter>:(可选)删除条件,表示要删除的文档。
  • writeConcern:(可选)写入操作的写入安全性级别。
  • collation:(可选)指定要用于字符串比较的规则。

示例:

db.users.deleteMany({age: {$lt: 18}})

在进行删除操作时,需要小心,因为它是永久性操作,一旦删除,数据将无法恢复。在删除之前,建议创建数据备份或在操作之前进行确认。

Java操作(MongoDB Java Driver)

Java 可以通过 MongoDB 官方提供的 Java 驱动程序(MongoDB Java Driver)来操作 MongoDB 数据库。

导入MongoDB Java Driver库文件

<!-- Maven依赖 -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.7.1</version>
</dependency>
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class MongoDBExample {

    public static void main(String[] args) {

        // 创建 MongoClient 对象,并连接到 MongoDB 服务器
        MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");

        // 选择要操作的数据库
        MongoDatabase database = mongoClient.getDatabase("mydb");

        // 选择要操作的集合
        MongoCollection<Document> collection = database.getCollection("mycollection");

        // 插入文档
        Document doc1 = new Document("name", "Alice").append("age", 25);
        Document doc2 = new Document("name", "Bob").append("age", 30);
        collection.insertMany(Arrays.asList(doc1, doc2));

        // 关闭连接
        mongoClient.close();

    }

}

​ 这个程序会连接到本地 MongoDB 服务器,并在名为 “mydb” 的数据库中的 “mycollection” 集合中插入两个文档,其中一个文档包含 “name” 和 “age” 两个字段,另一个文档也包含这两个字段。然后关闭连接。

  1. 插入文档
Document doc = new Document("name", "John Doe")
                .append("age", 30)
                .append("email", "johndoe@example.com");
collection.insertOne(doc);
  1. 查询文档
Document result = collection.find(Filters.eq("name", "John Doe")).first();

Filters类提供了很多静态方法,这些方法可以用来创建各种查询条件,如相等、不相等、小于、大于等比较运算符、逻辑运算符(与、或、非)等。

下面是一些常用的Filters静态方法:

  • eq(String fieldName, Object value):相等比较,返回符合指定字段等于指定值的文档。

  • ne(String fieldName, Object value):不等比较,返回符合指定字段不等于指定值的文档。

  • gt(String fieldName, Object value):大于比较,返回符合指定字段大于指定值的文档。

  • gte(String fieldName, Object value):大于等于比较,返回符合指定字段大于等于指定值的文档。

  • lt(String fieldName, Object value):小于比较,返回符合指定字段小于指定值的文档。

  • lte(String fieldName, Object value):小于等于比较,返回符合指定字段小于等于指定值的文档。

  • and(Bson... filters):逻辑与运算符,返回符合所有指定查询条件的文档。

  • or(Bson... filters):逻辑或运算符,返回符合任意指定查询条件的文档。

  • not(Bson filter):逻辑非运算符,返回符合指定查询条件取反后的文档。

  • regex() :正则查询,用于在查询中匹配指定的正则表达式。

Bson query = Filters.and(
    Filters.eq("name", "John"),
    Filters.gt("age", 18)
);
// Execute the query
FindIterable<Document> results = collection.find(query);

这个查询将返回所有 name 字段等于 “John” 且 age 字段大于 18 的文档。

  1. 更新文档
collection.updateOne(Filters.eq("name", "John Doe"), 
                      new Document("$set", new Document("age", 31)));
  1. 删除文档
collection.deleteOne(Filters.eq("name", "John Doe"));
  1. 导出文本
FileWriter writer = new FileWriter("d:\\output.txt");
MongoCursor<Document> cursor = collection.find().projection(Projections.exclude("_id" )).cursor();
JsonWriterSettings settings = JsonWriterSettings.builder()
    .indent(false)
    .build();
while (cursor.hasNext()) {
    Document document = cursor.next();
    System.out.println(document.toJson(settings));
    writer.write(document.toJson() + "\n");
}
writer.close();

Projections是MongoDB驱动程序中的一个类,用于在查询结果中只返回指定的字段,而不是返回整个文档。

常用的Projections方法及其含义如下:

  • include:指定返回结果中需要包含哪些字段。如果还需要包含_id字段,则需要使用excludeId()方法。
  • exclude:指定返回结果中不需要包含哪些字段。
  • excludeId:指定返回结果中不需要包含_id字段。
  • elemMatch:指定返回结果中数组类型的字段只返回满足条件的元素,条件使用Filters.eq、Filters.gt、Filters.lt等方法构建。

下面是一个使用Projections进行投影查询的例子:

MongoCollection<Document> collection = database.getCollection("mycollection");
Bson filter = Filters.eq("age", 30);
Bson projection = Projections.fields(Projections.include("name", "age"), Projections.excludeId());
FindIterable<Document> result = collection.find(filter).projection(projection);

在上述代码中,通过Projections.fields()方法指定了需要返回的字段(name和age),并且排除了_id字段。最后使用projection()方法将该投影查询应用于find()方法的结果中。

JsonWriterSettings 是 MongoDB Java Driver 中的一个类,用于配置 JsonWriter 的行为。JsonWriter 是将 MongoDB 文档序列化为 JSON 格式的类。在 MongoDB 4.4 以前的版本中,JsonWriterBsonWriter 是分开的,分别用于序列化为 JSON 格式和 BSON 格式。而在 MongoDB 4.4 以后的版本中,它们被合并为一个类,名为 BsonDocumentWriter,并且支持将文档序列化为多种格式。

以下是 JsonWriterSettings 中一些重要的属性:

  • indent:是否缩进输出,默认为 false。
  • indentCharacters:缩进使用的字符,默认为空格。
  • newLineCharacters:换行使用的字符,默认为系统默认的换行符。
  • maxLength:JSON 字符串最大长度,默认为 0,表示不限制长度。
  • escapeNonAsciiCharacters:是否将非 ASCII 字符进行转义,默认为 false。
  • dateTimeConverter:日期转换器,默认为 DefaultDateTimeConverter,可以通过实现 DateTimeConverter 接口来实现自定义的日期转换。
  • outputMode:输出模式,默认为 STRICT,可以选择 RELAXEDSHELL 模式。

使用 JsonWriterSettings,可以对 MongoDB 文档的序列化行为进行灵活的配置,以满足不同的需求。

待续。。。

Spring boot 操作

高级操作

数据聚合操作

索引的创建与使用

数据备份与恢复

安全性配置

实际应用场景

社交网络应用

物联网应用

数据存储与查询

日志分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Camera SDK NDK NDK_vendor介绍

Android Camera JNI NDK NDK_vendor介绍前言主要有哪几种interface&#xff1f;Android SDKCamera API 1Camera API 2小结Android NDKNDK InterfaceNDK Vendor Interface小结Camera VTS Testcase总结Reference前言 本篇博客是想介绍Android camera从application layer到camera…

谷歌插件Fetch在不同页面之间Cookie携带情况详解

content script 和 script inject 表现情况 在碰到content script 注入和用script标签注入一样&#xff0c;即使服务端有写入Cookie到域名下在该tab标签应用下也不会被保存&#xff0c;所以在发送时也无法自动携带&#xff0c;所以通过content script和<script>这种方式…

微信小程序第二节 —— 自定义组件。

&#x1f449;微信小程序第一节 —— 自定义顶部、底部导航栏以及获取胶囊体位置信息。 一、前言 &#x1f4d6;&#x1f4d6;&#x1f4d6;书接上回 &#xff0c;dai ga hou啊&#xff01;我是 &#x1f618;&#x1f618;&#x1f618;是江迪呀。在进行微信小程序开发中&am…

多维数组的地址,通过指针引用多维数组详解

通过指针引用一维数组可以参考这篇文章&#xff1a; 通过指针引用数组的几种方法的原理和差异&#xff1b;以及利用指针引用数组元素的技巧_juechen333的博客-CSDN博客一个数组包含若干元素&#xff0c;每个数组元素都占用存储单元&#xff0c;所以他们都有相应的地址&#xf…

《Ansible模块篇:debug模块详解》

一、简介 平时我们在使用ansible执行playbook时&#xff0c;经常可能会遇到一些错误&#xff0c;有的时候不知道问题在哪里 &#xff0c;这个时候可以使用-vvv参数打印出来详细信息&#xff0c;不过很多时候-vvv参数里很多东西并不是我们想要的&#xff0c;这时候就可以使用官方…

python第四天作业~函数练习

目录 作业4、判断以下哪些不能作为标识符 A、a B、&#xffe5;a C、_12 D、$a12 E、false F、False 作业5&#xff1a; 输入数&#xff0c;判断这个数是否是质数&#xff08;要求使用函数 for循环&#xff09; 作业6&#xff1a;求50~150之间的质数是…

ReentrantLock 源码解读

一、ReentrantLock ReentrantLock 是 java JUC 中的一个可重入锁&#xff0c;在上篇文章讲解 AQS 源码的时候提到 ReentrantLock 锁是基于 AQS 实现的&#xff0c;那是如何使用的 AQS 呢&#xff0c;本篇文章一起带大家看下 ReentrantLock 的源码。 在 AQS 中&#xff0c;如果…

linux安装influxdb-rpmyum方式

一、influxdb的安装InfluxDB简介时序数据库InfluxDB版是一款专门处理高写入和查询负载的时序数据库&#xff0c;用于存储大规模的时序数据并进行实时分析&#xff0c;包括来自DevOps监控、应用指标和IoT传感器上的数据主要特点&#xff1a;专为时间序列数据量身订造高性能数据存…

uniapp——ucharts的使用

ucharts是一个类似于echarts的图表框架 引入 在Hbuilder的插件下载仓库中搜索ucharts &#xff01;&#xff01;值得一提的是&#xff0c;Hbuilder的版本必须是大于3.1.0的&#xff01;&#xff01; 这样就导入到了项目的uni_modules里了 ucharts下载完成后&#xff0c;可以…

Java——异常机制

前言 随着对java的不断深入学习&#xff0c;在对语法以及编程思想有了一定的了解之后&#xff0c;在编程的过程中有可能会因为用户的输入不正确或者逻辑错误而出现异常或者错误&#xff0c;因此如何去捕捉与避免不应该出现的异常或者错误就变得十分重要。本文就介绍了java的异…

C++实现的二叉树创建和遍历,超入门邻家小女也懂了

目录 二叉树 特点 性质 二叉树的创建 声明 创建 -> 成员运算符 批量创建 二叉树的遍历 先序遍历 中序遍历 后序遍历 层序遍历 树的相关术语 特殊二叉树 满二叉树 完全二叉树 二叉树 树&#xff08;Tree&#xff09;是n(n≥0)个节点的有限集。在任意一棵…

Idea工具单工程使用卡顿设置

一、开启Idea内存占比指示 1.1、勾选Idea 内存指示器 1.2、右下角展示当前项目&#xff1a;内存/总内存&#xff08;726/1024MB&#xff09; ​​​​​​​ 二、修改Idea自定义内存 2.1、打开help - Edit Custom VM Options 2.2、自定义虚拟内存设置 -Xms1024m // 初始内存分…

【前端八股文】浏览器系列:浏览器渲染、前端路由、前端缓存(HTTP缓存)、缓存存储(HTTP缓存存储、本地存储)

文章目录渲染步骤DOM树与render树回流与重绘前端路由hash模式history模式两种模式对比前端缓存HTTP缓存强缓存协商缓存一般哪些文件对应哪些缓存HTTP缓存总结缓存存储HTTP缓存存储本地存储参考本系列目录&#xff1a;【前端八股文】目录总结 是以《代码随想录》八股文为主的笔记…

TTS | 语音合成论文概述

综述系列2021_A Survey on Neural Speech Synthesis论文&#xff1a;2106.15561.pdf (arxiv.org)论文从两个方面对神经语音合成领域的发展现状进行了梳理总结&#xff08;逻辑框架如图1所示&#xff09;&#xff1a;核心模块&#xff1a;分别从文本分析&#xff08;textanalysi…

【Linux内核一】在Linux系统下网口数据收发包的具体流向是什么?

在TCP/IP网络分层模型里&#xff0c;整个协议栈被分成了物理层、链路层、网络层&#xff0c;传输层和应用层。物理层对应的是网卡和网线&#xff0c;应用层对应的是我们常见的Nginx&#xff0c;FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中…

Linux(Centos)安装Minio集群

目录1&#xff1a;简介2&#xff1a;功能与集成3&#xff1a;架构4&#xff1a;搭建集群4.1&#xff1a;挂载磁盘4.1.1&#xff1a;要求4.1.2&#xff1a;创建挂载目录4.1.3&#xff1a;注意&#xff1a;需要将新建的目录挂在到对应的磁盘下,磁盘不挂载好&#xff0c;集群启动会…

Tomcat 并发达太大导致系统崩溃解决方案

当 Tomcat 并发达太大导致系统崩溃时&#xff0c;可以通过以下几个步骤来解决这个问题&#xff1a; 1、分析原因 首先需要分析系统崩溃的原因&#xff0c;是因为Tomcat的性能瓶颈还是因为代码的Bug&#xff0c;或者是系统资源不足等等。 2、优化代码 如果是代码的问题&…

Unity Lighting -- 为场景烘焙lightmap

烘焙光照是什么&#xff1f; Unity中有两种不同的光照方式&#xff1a;实时光照和烘焙光照。 实时光照 Unity会在运行时实时计算光照。实时光源每一帧都会进行计算&#xff0c;这意味着它们对于场景中移动的角色和物体的响应性非常好&#xff0c;但它的开销也很大。 烘焙光照…

DJ1-3 操作系统引论

目录 操作系统的结构设计 1. 无结构操作系统 2. 模块化 OS 结构 3. 分层式 OS 结构 4. 微内核 OS 结构 操作系统的结构设计 操作系统是一个大型系统软件&#xff0c;其结构已经历了四代的变革&#xff1a; 第一代 OS 是无结构第二代 OS 采用模块式结构第三代是层次式结构…

韩国绿芯1~16通道触摸芯片型号推荐

随着技术的发展&#xff0c;触摸感应技术正日益受到更多关注和应用&#xff0c;目前实现触摸感应的方式主要有两种&#xff0c;一种是电阻式&#xff0c;另一种是电容式。电容式触摸具有感应灵敏、功耗低、寿命长等特点&#xff0c;因此逐步取代电阻式触摸&#xff0c;成为当前…