本文演示如何在 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,仅包含 field | find({}, {_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
- 安全:不暴露内部标识符结构