当前位置: 首页 > news >正文

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()方法来插入单条文档数据。该方法接收一个文档对象作为参数,将其插入到指定集合中。

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、二进制数据等

示例文档结构:

{"_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. 用户资料存储
db.users.insertOne({username: "alice123",preferences: {theme: "dark",notifications: true},last_login: new Date()
})
  1. 产品目录
db.products.insertOne({name: "Laptop",price: 999.99,tags: ["electronics", "computers"],inventory: {warehouse1: 15,warehouse2: 8}
})

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

db.wzk.insert("hellworld!");

在这里插入图片描述

批量添加

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

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

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

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

注意事项:

  1. 批量插入默认是原子性的,要么全部成功,要么全部失败
  2. 可以通过 ordered 参数控制是否按顺序执行
  3. 大批量插入时建议分批进行,避免超时
  4. 插入前确保文档结构符合集合的模式要求
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(条件)
在这里插入图片描述
比如我最简单的查询

db.wzk.find({'0': 'h'});

在这里插入图片描述

逻辑查询

and条件查询详解

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

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

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

db.collection.find({$and: [{key1: value1},{key2: value2}]
})

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

这里使用多个条件:

db.wzk.find({ '0': 'h', '1': 'e'}).pretty();

在这里插入图片描述

or条件

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

在这里插入图片描述

not条件

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

基本语法
db.collection.find({field: {$not: {operator: value}}}).pretty()
详细说明
  1. $not会对后面的查询条件取反
  2. 可以配合各种操作符使用,如:
    • $eq(等于)
    • $gt(大于)
    • $lt(小于)
    • $regex(正则表达式)等
示例
  1. 查询年龄不等于25的用户:
db.users.find({age: {$not: {$eq: 25}}}).pretty()
  1. 查询名字不以"J"开头的用户(使用正则表达式):
db.users.find({name: {$not: {$regex: "^J"}}}).pretty()
  1. 查询成绩不在80-100之间的学生:
db.students.find({score: {$not: {$gt: 80, $lt: 100}}}).pretty()
注意事项
  1. $not操作符可能会导致查询性能下降,因为它需要扫描更多的文档
  2. 在使用正则表达式时,$not会匹配不符合该模式的所有文档
  3. 对于简单的等于判断,直接使用$ne操作符通常效率更高
应用场景
  • 需要排除特定条件的文档时
  • 构建复杂的逻辑查询时
  • 需要反向匹配正则表达式时
db.wzk.find({'0': {$not: { $eq: 'h'}}});

在这里插入图片描述

http://www.dtcms.com/a/470406.html

相关文章:

  • EasyExcel实现普通导入导出以及按模板导出excel文件
  • ubuntu 24.10安装MongoDB
  • 开源新经济:Web4.0时代的社区激励模型
  • NXP iMX8MM ARM 平台 Weston RDP 远程桌面部署测试
  • 低代码的系统化演进:从工具逻辑到平台架构的技术解读
  • 告别“时间战“:清北AI原创学习力模型,开启教育效率革命
  • 东莞市电商网站建设做室内概念图的网站
  • PowerShell 递归目录文件名冲突检查脚本(不区分大小写)
  • STM32项目分享:基于STM32的泳池防溺水检测手环
  • 权威解析GEO优化:如何提升品牌在AI搜索中的曝光?
  • C语言与Java语言编译过程及文件类型
  • 基于SpringBoot的农产品(商城)销售系统
  • 有名的网站建设wordpress博客站模板下载
  • 网站打不开如何解决深圳企业网站建设服务中心
  • 专业的论坛网站建设开发wordpress静态化
  • hive的一些优化配置
  • 做网站一屏一屏的盖州网站建设
  • 佳木斯建设工程交易中心网站在龙港网站哪里做
  • 工具收集 - ContextMenuManager 右键管理
  • 【软件设计师中级】计算机组成与结构(六):系统性能评测与可靠性基础 - 衡量计算机的“尺子“与“保险“
  • 当游戏NPC有了“灵魂”,网易伏羲解码游戏智能交互场景新实践
  • 热更新:移动应用的“空中加油”技术-详解什么是热更新?-优雅草卓伊凡卓伊凡的挑战
  • 【GD32】软、硬件I2C对比
  • YMODEM 协议介绍以及通信流程分析和Lua语言实现
  • 视频直播点播平台EasyDSS如何助力餐饮行业实现“明厨亮灶”直播?
  • 通过网站做外贸广告公司有哪些
  • 关于网站建设的好处seo搜索优化邵阳
  • 百家号淄博圻谷网站建设做网站页面一般用什么软件
  • CCF-GESP 等级考试 2024年3月认证C++三级真题解析
  • 本地部署 DeepSeek 私有助手:从零到上线的完整方案