Appearance
查询语句
基本查询
查询所有文档
javascript
db.users.find();
db.users.find({});查询单个文档
javascript
db.users.findOne();
db.users.findOne({ age: 25 });条件查询
javascript
db.users.find({ name: "张三" });
db.users.find({ age: 25, city: "北京" });指定返回字段
javascript
db.users.find({}, { name: 1, email: 1 });
db.users.find({}, { name: 1, email: 1, _id: 0 });
db.users.find({}, { password: 0 });比较查询
等于
javascript
db.users.find({ age: 25 });
db.users.find({ age: { $eq: 25 } });不等于
javascript
db.users.find({ age: { $ne: 25 } });大于/小于
javascript
db.users.find({ age: { $gt: 20 } });
db.users.find({ age: { $gte: 20 } });
db.users.find({ age: { $lt: 30 } });
db.users.find({ age: { $lte: 30 } });
db.users.find({ age: { $gt: 20, $lt: 30 } });范围查询
javascript
db.users.find({ age: { $in: [20, 25, 30] } });
db.users.find({ age: { $nin: [20, 25, 30] } });逻辑查询
AND
javascript
db.users.find({ age: { $gt: 20 }, city: "北京" });
db.users.find({ $and: [{ age: { $gt: 20 } }, { city: "北京" }] });OR
javascript
db.users.find({ $or: [{ age: { $lt: 20 } }, { age: { $gt: 50 } }] });NOT
javascript
db.users.find({ age: { $not: { $gt: 30 } } });NOR
javascript
db.users.find({ $nor: [{ age: { $lt: 20 } }, { age: { $gt: 50 } }] });元素查询
字段存在
javascript
db.users.find({ email: { $exists: true } });
db.users.find({ email: { $exists: false } });类型查询
javascript
db.users.find({ age: { $type: "number" } });
db.users.find({ age: { $type: ["number", "string"] } });
db.users.find({ name: { $type: 2 } });数组查询
匹配数组元素
javascript
db.users.find({ tags: "tech" });
db.users.find({ tags: { $all: ["tech", "life"] } });精确匹配数组
javascript
db.users.find({ tags: ["tech", "life"] });数组长度
javascript
db.users.find({ tags: { $size: 3 } });数组元素匹配
javascript
db.users.find({
scores: { $elemMatch: { $gt: 80, $lt: 90 } },
});
db.users.find({
addresses: { $elemMatch: { city: "北京", type: "home" } },
});数组索引查询
javascript
db.users.find({ "tags.0": "tech" });
db.users.find({ "addresses.0.city": "北京" });嵌套文档查询
点号查询
javascript
db.users.find({ "profile.age": 25 });
db.users.find({ "profile.city": "北京" });嵌套文档匹配
javascript
db.users.find({
profile: { age: 25, city: "北京" },
});多层嵌套
javascript
db.users.find({ "profile.basic.age": 25 });
db.users.find({ "profile.contact.email": "test@example.com" });正则表达式
基本正则
javascript
db.users.find({ name: /^张/ });
db.users.find({ name: /三$/ });
db.users.find({ name: { $regex: /^张/ } });正则选项
javascript
db.users.find({ name: { $regex: "zhang", $options: "i" } });正则选项说明
| 选项 | 说明 |
|---|---|
| i | 不区分大小写 |
| m | 多行匹配 |
| x | 忽略空白 |
| s | 匹配所有字符 |
排序与分页
排序
javascript
db.users.find().sort({ age: 1 });
db.users.find().sort({ age: -1 });
db.users.find().sort({ age: -1, name: 1 });分页
javascript
db.users.find().limit(10);
db.users.find().skip(10).limit(10);分页公式
javascript
let page = 2;
let pageSize = 10;
db.users
.find()
.skip((page - 1) * pageSize)
.limit(pageSize);排序分页
javascript
db.users.find().sort({ created_at: -1 }).skip(0).limit(10);计数
计数方法
javascript
db.users.countDocuments();
db.users.countDocuments({ age: { $gt: 20 } });
db.users.estimatedDocumentCount();聚合计数
javascript
db.users.aggregate([{ $match: { age: { $gt: 20 } } }, { $count: "total" }]);去重
distinct
javascript
db.users.distinct("city");
db.users.distinct("city", { age: { $gt: 20 } });聚合去重
javascript
db.users.aggregate([{ $group: { _id: "$city" } }]);聚合管道
基本结构
javascript
db.collection.aggregate([
{ stage1 },
{ stage2 },
...
])$match - 过滤
javascript
db.users.aggregate([{ $match: { age: { $gt: 20 } } }]);$group - 分组
javascript
db.users.aggregate([{ $group: { _id: "$city", count: { $sum: 1 } } }]);
db.users.aggregate([{ $group: { _id: "$city", avgAge: { $avg: "$age" } } }]);聚合累加器
| 累加器 | 说明 |
|---|---|
| $sum | 求和 |
| $avg | 平均值 |
| $min | 最小值 |
| $max | 最大值 |
| $first | 第一个值 |
| $last | 最后一个值 |
| $push | 添加到数组 |
| $addToSet | 添加唯一值 |
$project - 投影
javascript
db.users.aggregate([{ $project: { name: 1, email: 1, _id: 0 } }]);
db.users.aggregate([
{
$project: {
name: 1,
email: 1,
ageGroup: {
$cond: {
if: { $gte: ["$age", 18] },
then: "adult",
else: "minor",
},
},
},
},
]);$sort - 排序
javascript
db.users.aggregate([{ $sort: { age: -1 } }]);$limit 和 $skip
javascript
db.users.aggregate([{ $sort: { age: -1 } }, { $skip: 0 }, { $limit: 10 }]);$unwind - 展开数组
javascript
db.users.aggregate([{ $unwind: "$tags" }]);
db.users.aggregate([
{ $unwind: { path: "$tags", preserveNullAndEmptyArrays: true } },
]);$lookup - 关联查询
javascript
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "user_id",
foreignField: "_id",
as: "user",
},
},
]);
db.orders.aggregate([
{
$lookup: {
from: "users",
let: { userId: "$user_id" },
pipeline: [
{ $match: { $expr: { $eq: ["$_id", "$$userId"] } } },
{ $project: { name: 1, email: 1 } },
],
as: "user",
},
},
]);$addFields - 添加字段
javascript
db.users.aggregate([
{
$addFields: {
fullName: { $concat: ["$firstName", " ", "$lastName"] },
},
},
]);$replaceRoot - 替换根文档
javascript
db.users.aggregate([{ $replaceRoot: { newRoot: "$profile" } }]);$facet - 多管道处理
javascript
db.users.aggregate([
{
$facet: {
ageGroups: [{ $group: { _id: "$age", count: { $sum: 1 } } }],
cityStats: [{ $group: { _id: "$city", count: { $sum: 1 } } }],
},
},
]);$bucket - 分桶
javascript
db.users.aggregate([
{
$bucket: {
groupBy: "$age",
boundaries: [0, 20, 40, 60, 80],
default: "other",
output: {
count: { $sum: 1 },
names: { $push: "$name" },
},
},
},
]);文本搜索
创建文本索引
javascript
db.articles.createIndex({ title: "text", content: "text" });文本搜索
javascript
db.articles.find({ $text: { $search: "MongoDB" } });
db.articles.find({ $text: { $search: "MongoDB database" } });
db.articles.find({ $text: { $search: '"MongoDB database"' } });排除词
javascript
db.articles.find({ $text: { $search: "MongoDB -database" } });相关性评分
javascript
db.articles
.find({ $text: { $search: "MongoDB" } }, { score: { $meta: "textScore" } })
.sort({ score: { $meta: "textScore" } });地理空间查询
创建地理空间索引
javascript
db.places.createIndex({ location: "2dsphere" });
db.places.createIndex({ location: "2d" });附近查询
javascript
db.places.find({
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [116.397, 39.909],
},
$maxDistance: 1000,
},
},
});范围查询
javascript
db.places.find({
location: {
$geoWithin: {
$centerSphere: [[116.397, 39.909], 10 / 6378.1],
},
},
});多边形查询
javascript
db.places.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [
[
[116.0, 39.0],
[117.0, 39.0],
[117.0, 40.0],
[116.0, 40.0],
[116.0, 39.0],
],
],
},
},
},
});查询优化
explain
javascript
db.users.find({ name: "张三" }).explain();
db.users.find({ name: "张三" }).explain("executionStats");
db.users.find({ name: "张三" }).explain("allPlansExecution");hint
javascript
db.users.find({ name: "张三" }).hint({ name: 1 });
db.users.find({ name: "张三" }).hint("name_1");
db.users.find({ name: "张三" }).hint({ $natural: 1 });maxTimeMS
javascript
db.users.find({ name: "张三" }).maxTimeMS(1000);游标
javascript
let cursor = db.users.find().batchSize(100);
while (cursor.hasNext()) {
printjson(cursor.next());
}