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'}}});
相关推荐
笃行客从不躺平9 分钟前
遇到大SQL怎么处理
java·开发语言·数据库·sql
郝学胜-神的一滴9 分钟前
Python中常见的内置类型
开发语言·python·程序人生·个人开发
q***876016 分钟前
Spring Boot 整合 Keycloak
java·spring boot·后端
Billow_lamb17 分钟前
Spring Boot2.x.x全局拦截器
java·spring boot·后端
上不如老下不如小27 分钟前
2025年第七届全国高校计算机能力挑战赛初赛 Java组 编程题汇总
java·计算机能力挑战赛
g***B73832 分钟前
Kotlin协程在Android中的使用
android·开发语言·kotlin
火白学安全36 分钟前
《Python红队攻防零基础脚本编写:进阶篇(一)》
开发语言·python·安全·web安全·网络安全·系统安全
爱码小白39 分钟前
PyQt5 QTimer总结
开发语言·qt
逻极39 分钟前
Redis Queue (RQ) 核心原理:轻量任务队列的设计与实践(一句话讲透核心本质)
数据库·redis·bootstrap
泉城老铁43 分钟前
Springboot对接mqtt
java·spring boot·后端