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

mongodb:增删改查和特殊查询符号手册

前言

        最近考虑开发游戏,网上推荐使用非关系数据库mongodb,因此浅尝了一番,并将一些语句和符号记录在这里。

        相对于mysql、oracle这些关系型数据库,基于json文档的mongodb在很多地方都与之大不相同(可以类比为TCP握手连接、和UDP无连接这样的差异),开始学的时候,挺难转变固有设计思路的。

增删改查

1. 创建(Create)

在 MongoDB 中,创建操作通常指插入文档到集合中。

插入单个文档
db.collectionName.insertOne({field1: value1,field2: value2,// ...
});
插入多个文档
db.collectionName.insertMany([{ field1: value1, field2: value2 },{ field1: value3, field2: value4 },// ...
]);

2. 读取(Read)

读取操作是指从集合中检索文档。

查询所有文档
db.collectionName.find({});
查询特定条件的文档
db.collectionName.find({ field1: value1 });
查询并返回特定字段
db.collectionName.find({ field1: value1 }, { field2: 1, _id: 0 }); // 只返回 field2 字段,不返回 _id 字段

3. 更新(Update)

更新操作是指修改集合中的文档。

更新单个文档
db.collectionName.updateOne({ field1: value1 }, // 查询条件{ $set: { field2: newValue2 } } // 更新操作
);
更新多个文档
db.collectionName.updateMany({ field1: value1 }, // 查询条件{ $set: { field2: newValue2 } } // 更新操作
);

4. 删除(Delete)

删除操作是指从集合中移除文档。

删除单个文档
db.collectionName.deleteOne({ field1: value1 });
删除多个文档
db.collectionName.deleteMany({ field1: value1 });

复杂的查询 

1. 常用操作

计数文档
db.collectionName.countDocuments({ field1: value1 });
排序文档
db.collectionName.find({}).sort({ field1: 1 }); // 升序排序
db.collectionName.find({}).sort({ field1: -1 }); // 降序排序
分页查询
db.collectionName.find({}).skip(10).limit(5); // 跳过前10个文档,返回接下来的5个文档
根据id查询 
db.collectionName.find({ _id: ObjectId("671db3ea81470184298c3d44") });
聚合查询
//查询某辆车某种成色的情况
db.global_item.aggregate([{$match: {car_type: "SUV"}},{$unwind: "$car_fine"},{$match: {"car_fine.fine": "饱经摧残"}},{$project: {_id: 1,desc: "$car_fine.desc",fine: "$car_fine.fine",mile_fix: "$car_fine.mile_fix",person_fix: "$car_fine.person_fix",refit: "$car_fine.refit",speed_fix: "$car_fine.speed_fix",weight_fix: "$car_fine.weight_fix"}}
])
解释
  1. $match

    • 第一个 $match 阶段过滤出 car_type 为 "SUV" 的文档。
  2. $unwind

    • $unwind 展开 car_fine 数组,每个元素都会生成一个新的文档。
  3. $match

    • 第二个 $match 阶段过滤出 car_fine.fine 字段为 "饱经摧残" 的文档。
  4. $project

    • $project 阶段只返回你需要的字段,并重新命名这些字段以符合你的输出格式。

 

复杂查询操作符 

1. 逻辑操作符
  • $and:匹配所有给定条件
  • $or:匹配任意一个给定条件
  • $not:对条件取反
  • $nor:不匹配所有给定条件
示例:
// 使用 $and 操作符,匹配 field1 = value1 且 field2 = value2 的文档
db.collectionName.find({$and: [{ field1: value1 },{ field2: value2 }]
});// 使用 $or 操作符,匹配 field1 = value1 或 field2 = value2 的文档
db.collectionName.find({$or: [{ field1: value1 },{ field2: value2 }]
});// 使用 $not 操作符,匹配 field1 不等于 value1 的文档
db.collectionName.find({field1: { $not: { $eq: value1 } }
});// 使用 $nor 操作符,不匹配 field1 = value1 且 field2 = value2 的文档
db.collectionName.find({$nor: [{ field1: value1 },{ field2: value2 }]
});

2. 比较操作符
  • $eq:等于
  • $ne:不等于
  • $gt:大于
  • $gte:大于等于
  • $lt:小于
  • $lte:小于等于
  • $in:在数组中的值
  • $nin:不在数组中的值
示例:
// 查找 field1 等于 value1 的文档
db.collectionName.find({ field1: { $eq: value1 } });// 查找 field1 不等于 value1 的文档
db.collectionName.find({ field1: { $ne: value1 } });// 查找 field2 大于 value2 的文档
db.collectionName.find({ field2: { $gt: value2 } });// 查找 field2 大于等于 value2 的文档
db.collectionName.find({ field2: { $gte: value2 } });// 查找 field2 小于 value2 的文档
db.collectionName.find({ field2: { $lt: value2 } });// 查找 field2 小于等于 value2 的文档
db.collectionName.find({ field2: { $lte: value2 } });// 查找 field1 的值在 [value1, value2, value3] 数组中的文档
db.collectionName.find({ field1: { $in: [value1, value2, value3] } });// 查找 field1 的值不在 [value1, value2, value3] 数组中的文档
db.collectionName.find({ field1: { $nin: [value1, value2, value3] } });

3. 元素操作符
  • $exists:判断字段是否存在
  • $type:判断字段类型
示例:
// 查找包含 field1 字段的文档(无论 field1 的值是什么)
db.collectionName.find({ field1: { $exists: true } });// 查找不包含 field1 字段的文档
db.collectionName.find({ field1: { $exists: false } });// 查找 field1 的类型为指定类型的文档(MongoDB类型编号或名称)
db.collectionName.find({ field1: { $type: "string" } }); // 或者使用类型编号,如 $type: 2

4. 数组操作符
  • $all:匹配数组中所有元素
  • $elemMatch:匹配数组中的嵌套文档或特定条件
  • $size:匹配数组长度
示例:
// 查找数组字段 fieldArray 包含所有指定元素的文档
db.collectionName.find({ fieldArray:

        看着都头疼 

http://www.lryc.cn/news/473434.html

相关文章:

  • 你的Mac book多久没有清洁键盘屏幕了,Mac清洁好帮手来了
  • ANA基因组数据库(ANAgdb)
  • leetcode 704 二分查找
  • Vue学习笔记(十一)
  • ABAP进阶学习1:动态内表1-通过系统表LVC_T_FCAT类型定义内表
  • 【Vispy库】一个用于高性能交互式2D/3D数据可视化库 Python库
  • 为什么 C 语言数组是从 0 开始计数的?
  • matlab线性度计算程序
  • 为什么NMOS管比PMOS管更受欢迎?
  • 【论文复现】短期电力负荷
  • pytest脚本常用的执行命令
  • OpenCv入门
  • 超详细的flex教程(面试必考)
  • C++的输入与输出
  • 上海剧某文化传播有限公司与喜某(上海)网络科技有限公司、上海喜某科技有限公司侵害著作权及不正当竞争纠纷案
  • 【c++篇】:模拟实现string类--探索字符串操作的底层逻辑
  • springboot配置logback.xml遇到的几个问题
  • MySQL 5.7与MySQL 8.0对比
  • 【代码随想录Day55】图论Part07
  • 软考在即!这些注意事项你提前了解!
  • CMake知识点
  • git ls-remote
  • 低代码平台如何通过AI赋能,实现更智能的业务自动化?
  • 计算疫情扩散时间
  • 【Windows11】24H2 内存占用高(截至10月31日)
  • 题目:多个字符从两端移动,向中间汇聚
  • 前端如何安全存储密钥,防止信息泄露
  • 银行电子户分账解决电商行业哪些问题
  • Web音乐库:SpringBoot实现的音乐网站
  • Rust: 加密算法库 ring 如何用于 RSA 数字签名?