Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB find() 排除 _id 字段:Projection 语法 { _id: 0 }

本文演示如何在 MongoDB find() 查询中使用 Projection(投影)参数 { _id: 0 } 来排除默认包含的 _id 字段。

语法

db.yourCollectionName.find({}, { _id: 0 });

创建示例数据

> db.excludeIdDemo.insertOne({"CustomerName":"Larry"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7f62c1a844af18acdffb9") }
> db.excludeIdDemo.insertOne({"CustomerName":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7f6311a844af18acdffba") }
> db.excludeIdDemo.insertOne({"CustomerName":"Mike"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7f6351a844af18acdffbb") }
> db.excludeIdDemo.insertOne({"CustomerName":"Bob"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7f6381a844af18acdffbc") }

默认 find() 包含 _id

> db.excludeIdDemo.find().pretty();
{ "_id" : ObjectId("5cd7f62c1a844af18acdffb9"), "CustomerName" : "Larry" }
{ "_id" : ObjectId("5cd7f6311a844af18acdffba"), "CustomerName" : "Chris" }
{ "_id" : ObjectId("5cd7f6351a844af18acdffbb"), "CustomerName" : "Mike" }
{ "_id" : ObjectId("5cd7f6381a844af18acdffbc"), "CustomerName" : "Bob" }

使用 Projection 排除 _id

> db.excludeIdDemo.find({}, { _id: 0 });

结果(无 _id 字段)

{ "CustomerName" : "Larry" }
{ "CustomerName" : "Chris" }
{ "CustomerName" : "Mike" }
{ "CustomerName" : "Bob" }

Projection 规则详解

语法效果示例
{} 或无第二参数包含所有字段(含 _id)find({})
{ field: 1 }仅包含指定字段(+ _id)find({}, {name: 1})
{ field: 0 }排除指定字段(其他全包含)find({}, {_id: 0})
{ _id: 0, field: 1 }排除 _id,仅包含 fieldfind({}, {_id: 0, name: 1})

重要限制

  • 不能混合 0 和 1(_id 除外):{ name: 1, age: 0 } ❌ 报错
  • _id 默认包含,必须显式 _id: 0 排除
  • 嵌套字段:{ "address.city": 1 } 或 { "address.city": 0 }
  • Array 元素:{ "tags": 1 } 包含整个数组,{ "tags.$": 1 } 配合查询条件

Aggregation 中的 $project 对比

// find() projection
db.col.find({}, { _id: 0, name: 1 });

// aggregate() $project
db.col.aggregate([{ $project: { _id: 0, name: 1 } }]);
// 功能相似但 $project 更强大(可计算新字段、重命名、数组操作等)

实际应用场景

  • API 返回前端不需要 _id 时,减少网络传输
  • 导出数据到 CSV/Excel 时排除内部 ID
  • 安全:不暴露内部标识符结构