文章演示了如何在 MongoDB Aggregation Framework 中使用 $project 排除 _id 字段,同时仅包含特定字段(如 StudentFirstName)。
创建示例数据
> db.excludeIdDemo.insertOne({"StudentFirstName":"John","StudentAge":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd701a56d78f205348bc632") }
> db.excludeIdDemo.insertOne({"StudentFirstName":"Robert","StudentAge":20});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd701af6d78f205348bc633") }
> db.excludeIdDemo.insertOne({"StudentFirstName":"Chris","StudentAge":24});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd701b86d78f205348bc634") }
显示所有文档
> db.excludeIdDemo.find();
{ "_id" : ObjectId("5cd701a56d78f205348bc632"), "StudentFirstName" : "John", "StudentAge" : 21 }
{ "_id" : ObjectId("5cd701af6d78f205348bc633"), "StudentFirstName" : "Robert", "StudentAge" : 20 }
{ "_id" : ObjectId("5cd701b86d78f205348bc634"), "StudentFirstName" : "Chris", "StudentAge" : 24 }
使用 Aggregation $project 排除 _id 仅包含 StudentFirstName
> db.excludeIdDemo.aggregate(
{
$project : {
_id : 0,
"StudentFirstName": 1
}
}
);
结果
{ "StudentFirstName" : "John" }
{ "StudentFirstName" : "Robert" }
{ "StudentFirstName" : "Chris" }
关键点说明
_id: 0- 明确排除 _id 字段(默认包含)"StudentFirstName": 1- 包含 StudentFirstName 字段- 在 $project 中,除了 _id 默认包含外,其他字段必须显式指定 1 才会包含
- 不能在同一个 $project 中混合使用 0 和 1(_id 除外)
对比:find() 的 Projection
// find() 也可以排除 _id
db.excludeIdDemo.find({}, { _id: 0, StudentFirstName: 1 });
// 结果相同但 find() 返回 Cursor,aggregate() 返回 Aggregation Cursor
进阶:动态排除字段
// 如果字段名在变量中
var excludeField = "_id";
var includeField = "StudentFirstName";
var projectSpec = {};
projectSpec[excludeField] = 0;
projectSpec[includeField] = 1;
db.excludeIdDemo.aggregate([{ $project: projectSpec }]);