Java-146 深入浅出 MongoDB 数据插入、批量写入、BSON 格式与逻辑查询and or not操作指南

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!"快的模型 + 深度思考模型 + 实时路由",持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年10月07日更新到:
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)

MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

数据操作

数据添加

单条数据插入操作

MongoDB提供了insertOne()方法来插入单条文档数据。该方法接收一个文档对象作为参数,将其插入到指定集合中。

javascript 复制代码
db.collection.insertOne(
   { 
     name: "John Doe",
     age: 30,
     email: "john@example.com",
     address: {
       city: "New York",
       zip: "10001"
     },
     hobbies: ["reading", "hiking"]
   }
)

文档数据结构

MongoDB文档采用类似JSON的结构,但使用更丰富的BSON格式。文档由字段和值对组成,支持以下数据类型:

  • 基本类型:字符串、数值、布尔值
  • 复杂类型:数组、嵌套文档
  • 特殊类型:日期、ObjectId、二进制数据等

示例文档结构:

json 复制代码
{
  "_id": ObjectId("507f191e810c19729de860ea"),
  "username": "johndoe",
  "created_at": ISODate("2023-01-15T10:30:00Z"),
  "scores": [85, 92, 78],
  "profile": {
    "firstName": "John",
    "lastName": "Doe"
  }
}

BSON格式详解

BSON(Binary JSON)是MongoDB使用的二进制编码格式,具有以下特点:

  1. 效率更高:二进制格式比文本格式解析更快
  2. 数据类型更丰富:支持日期、二进制数据等额外类型
  3. 可遍历性:BSON文档包含长度前缀,便于快速扫描

BSON与JSON的主要区别:

  • BSON支持二进制数据,JSON不支持
  • BSON有特定的日期类型,JSON用字符串表示日期
  • BSON文档包含元数据,如字段长度信息

实际应用场景

  1. 用户资料存储
javascript 复制代码
db.users.insertOne({
  username: "alice123",
  preferences: {
    theme: "dark",
    notifications: true
  },
  last_login: new Date()
})
  1. 产品目录
javascript 复制代码
db.products.insertOne({
  name: "Laptop",
  price: 999.99,
  tags: ["electronics", "computers"],
  inventory: {
    warehouse1: 15,
    warehouse2: 8
  }
})

注意:当插入文档时,如果未指定_id字段,MongoDB会自动生成一个唯一的ObjectId作为该文档的标识符。

shell 复制代码
db.wzk.insert("hellworld!");

批量添加

在 MongoDB 中,insert 操作不仅支持单条文档插入,还可以进行批量 BSON 文档的添加。批量插入可以显著提高数据插入效率,特别是在需要插入大量数据时。以下是几种常见的批量插入方式:

  1. 数组批量插入
javascript 复制代码
db.collection.insert([
  {name: "文档1", value: 100},
  {name: "文档2", value: 200},
  {name: "文档3", value: 300}
])
  1. 使用 insertMany 方法
javascript 复制代码
db.collection.insertMany([
  {_id: 1, title: "文章A"},
  {_id: 2, title: "文章B"},
  {_id: 3, title: "文章C"}
])
  1. 批量插入的配置选项
javascript 复制代码
db.collection.insertMany(
  [...], // 文档数组
  {
    ordered: false, // 是否按顺序执行
    writeConcern: {...} // 写入关注级别
  }
)

批量插入的应用场景包括:

  • 初始化数据库时导入大量初始数据
  • 从其他数据源迁移数据到 MongoDB
  • 执行批量数据处理任务
  • 日志系统大量写入日志记录

注意事项:

  1. 批量插入默认是原子性的,要么全部成功,要么全部失败
  2. 可以通过 ordered 参数控制是否按顺序执行
  3. 大批量插入时建议分批进行,避免超时
  4. 插入前确保文档结构符合集合的模式要求
shell 复制代码
db.wzk.insert(["hello!", "world!"])

数据查询

MongoDB提供了丰富的查询操作符来实现各种条件查询,主要包括以下几类:

比较操作符

  1. 等于($eq)

    • 查询指定字段等于某个值的文档
    • 示例:db.collection.find({age: {$eq: 25}})
  2. 不等于($ne)

    • 查询指定字段不等于某个值的文档
    • 示例:db.collection.find({age: {$ne: 25}})
  3. 大于($gt)

    • 查询指定字段大于某个值的文档
    • 示例:db.collection.find({age: {$gt: 25}})
  4. 大于等于($gte)

    • 查询指定字段大于或等于某个值的文档
    • 示例:db.collection.find({age: {$gte: 25}})
  5. 小于($lt)

    • 查询指定字段小于某个值的文档
    • 示例:db.collection.find({age: {$lt: 25}})
  6. 小于等于($lte)

    • 查询指定字段小于或等于某个值的文档
    • 示例:db.collection.find({age: {$lte: 25}})

组合查询

可以使用逻辑操作符组合多个条件:

  • $and:同时满足多个条件
    • 示例:db.collection.find({$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]})
  • $or:满足任意一个条件
    • 示例:db.collection.find({$or: [{age: {$lt: 20}}, {age: {$gt: 30}}]})

使用场景

  1. 范围查询:查找年龄在20-30岁之间的用户
    • db.users.find({age: {$gte: 20, $lte: 30}})
  2. 排除特定值:查找所有不是VIP的用户
    • db.users.find({vip: {$ne: true}})
  3. 组合条件:查找年龄大于25岁或者收入低于5000的用户
    • db.users.find({$or: [{age: {$gt: 25}}, {income: {$lt: 5000}}]})

这些查询操作可以结合索引使用以提高查询效率,特别是在处理大量数据时,合理的查询条件和索引设计能显著提升查询性能。

db.wzk.find(条件)

比如我最简单的查询

shell 复制代码
db.wzk.find({'0': 'h'});

逻辑查询

and条件查询详解

在MongoDB中,使用逗号分隔多个查询条件时,默认执行的是逻辑AND操作。这表示查询结果必须同时满足所有指定条件才会被返回。

基本语法
shell 复制代码
db.collection.find({
    key1: value1,
    key2: value2
}).pretty()
实际应用示例
  1. 查询用户集合中年龄为25岁且职业为"程序员"的文档:
shell 复制代码
db.users.find({
    age: 25,
    profession: "程序员"
}).pretty()
  1. 查询订单集合中状态为"已完成"且总金额大于1000的订单:
shell 复制代码
db.orders.find({
    status: "已完成",
    total: {$gt: 1000}
}).pretty()
注意事项
  • 当字段值为数组时,AND查询要求数组必须包含所有指定元素
  • 可以组合使用不同类型的查询条件(等于、范围、正则等)
  • 对于嵌套文档,可以使用点表示法进行AND查询
性能优化建议
  • 为经常组合查询的字段创建复合索引
  • 将选择性更高的条件放在前面
  • 使用explain()分析查询执行计划
扩展说明

除了使用逗号分隔的隐式AND,也可以显式使用$and操作符:

shell 复制代码
db.collection.find({
    $and: [
        {key1: value1},
        {key2: value2}
    ]
})

显式and通常在需要组合or等复杂查询时使用,或者在同一个字段上需要多个条件时特别有用。

这里使用多个条件:

shell 复制代码
db.wzk.find({ '0': 'h', '1': 'e'}).pretty();

or条件

shell 复制代码
db.wzk.find($or:[{key1:value1, key2:value2}]).pretty()
shell 复制代码
db.wzk.find({$or: [{'0': 'h'}, {'0': 'x'}]}).pretty();

not条件

$not是MongoDB中的一个逻辑查询操作符,用于对指定条件取反。它通常与其他查询操作符配合使用,可以构建更复杂的查询条件。

基本语法
shell 复制代码
db.collection.find({field: {$not: {operator: value}}}).pretty()
详细说明
  1. $not会对后面的查询条件取反
  2. 可以配合各种操作符使用,如:
    • $eq(等于)
    • $gt(大于)
    • $lt(小于)
    • $regex(正则表达式)等
示例
  1. 查询年龄不等于25的用户:
shell 复制代码
db.users.find({age: {$not: {$eq: 25}}}).pretty()
  1. 查询名字不以"J"开头的用户(使用正则表达式):
shell 复制代码
db.users.find({name: {$not: {$regex: "^J"}}}).pretty()
  1. 查询成绩不在80-100之间的学生:
shell 复制代码
db.students.find({score: {$not: {$gt: 80, $lt: 100}}}).pretty()
注意事项
  1. $not操作符可能会导致查询性能下降,因为它需要扫描更多的文档
  2. 在使用正则表达式时,$not会匹配不符合该模式的所有文档
  3. 对于简单的等于判断,直接使用$ne操作符通常效率更高
应用场景
  • 需要排除特定条件的文档时
  • 构建复杂的逻辑查询时
  • 需要反向匹配正则表达式时
shell 复制代码
db.wzk.find({'0': {$not: { $eq: 'h'}}});
相关推荐
初圣魔门首席弟子3 小时前
const string getWord() ;和 string getWord() const ;是一样的效果吗
开发语言·c++
虎子_layor3 小时前
从0到1学习泛型
java
奥尔特星云大使3 小时前
MySQL快速构建主从(基于GTID)
数据库·mysql·主从复制
小园子的小菜3 小时前
MySQL ORDER BY 深度解析:索引排序规则与关键配置参数阈值
数据库·mysql
wxjlkh3 小时前
Oracle Exadata一体机简介 1千多个W
数据库·oracle
lly2024063 小时前
Docker 安装 Node.js
开发语言
明天会有多晴朗3 小时前
C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
c语言·开发语言·算法
泽虞3 小时前
《Qt应用开发》笔记p3
linux·开发语言·数据库·c++·笔记·qt·面试
晓风残月淡3 小时前
JVM字节码与类的加载(一):类的加载过程详解
开发语言·jvm·python