Skip to content

查询语句

基本查询

查询所有文档

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());
}

下一步学习