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查询
sql 复制代码
db.collectionName.find({ _id: ObjectId("671db3ea81470184298c3d44") });
聚合查询
sql 复制代码
//查询某辆车某种成色的情况
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:

看着都头疼

相关推荐
一行玩python11 分钟前
SQLAlchemy,ORM的Python标杆!
开发语言·数据库·python·oracle
MXsoft61831 分钟前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
TheITSea42 分钟前
云服务器宝塔安装静态网页 WordPress、VuePress流程记录
java·服务器·数据库
王ASC2 小时前
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。ojdbc8版本23.2.0.0驱动BUG【已解决】
数据库·sql·oracle
Dlwyz2 小时前
问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
数据库·redis·缓存
如意机反光镜裸2 小时前
如何快速将Excel数据导入到SQL Server数据库
数据库
不爱学习的啊Biao3 小时前
初识mysql数据库
数据库·mysql·oracle
宛唐羁客4 小时前
ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法
网络·数据库
吴半杯4 小时前
Redis-monitor安装与配置
数据库·redis·缓存
是桃萌萌鸭~5 小时前
mysqldbcompare 使用及参数详解
数据库·mysql