前言
最近考虑开发游戏,网上推荐使用非关系数据库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"
}
}
])
解释
-
$match:
- 第一个
$match
阶段过滤出car_type
为"SUV"
的文档。
- 第一个
-
$unwind:
$unwind
展开car_fine
数组,每个元素都会生成一个新的文档。
-
$match:
- 第二个
$match
阶段过滤出car_fine.fine
字段为"饱经摧残"
的文档。
- 第二个
-
$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:
看着都头疼