Skip to content

MongoDB 高级索引

复合索引

多字段组成一个索引,字段顺序影响可支持的查询与排序:

javascript
db.orders.createIndex({ userId: 1, createdAt: -1 });

适合:{ userId: 1 }{ userId: 1, createdAt: -1 } 等查询与排序;仅 { createdAt: -1 } 无法高效使用该索引。

多键索引(数组)

对数组字段建索引时,MongoDB 会为每个数组元素建索引项(多键索引)。一个文档的数组字段在一个多键索引中最多贡献一项(3.4+ 的规则),适合对数组元素做等值或范围查询。

文本索引

全文检索用文本索引:

javascript
db.articles.createIndex({ content: "text", title: "text" });
db.articles.find({ $text: { $search: "MongoDB 教程" } });

可指定权重、语言等,见 MongoDB 全文检索

地理空间索引

二维球面(如经纬度):

javascript
db.places.createIndex({ location: "2dsphere" });
db.places.find({
  location: {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [116.4, 39.9],
      },
    },
  },
});

TTL 索引

使文档在指定时间后自动删除:

javascript
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 });

唯一索引与部分索引

javascript
db.users.createIndex({ email: 1 }, { unique: true });
db.users.createIndex(
  { status: 1 },
  { partialFilterExpression: { status: "active" } },
);

部分索引只对满足条件的文档建索引,节省空间。下一节介绍 MongoDB 索引限制