这是一个非常简单的问题,只是一个非常糟糕的大脑冻结。在我的聚合中,我只想使用$ project删除'_id'字段,但返回其他所有内容。但是我得到了
“$ projection需要至少一个输出字段”
我认为就像:
db.coll.aggregate( [ { $match .... }, { $project: { _id: 0 }}])
由于
答案 0 :(得分:6)
通过各种管道操作或$project
使用聚合时,您需要明确包含字段。除非由字段名称明确定义,否则目前无法返回所有字段:
$project : {
_id : 0,
"Name" : 1,
"Address" : 1
}
您可以使用您使用的技术排除_id
,如上所示。
答案 1 :(得分:1)
在 v4.2 中,您可以使用$unset
聚合运算符删除单个或多个字段。您还可以使用点符号从嵌入式文档中排除一个或多个字段。
要删除单个字段:
db.coll.aggregate([ { $unset: "_id" } ])
要删除多个字段:
db.coll.aggregate([ { $unset: [ "_id" ] } ])
要删除嵌入的字段,请执行以下操作:
db.coll.aggregate([
{ $unset: [ "_id", "author.name" ] }
])
答案 2 :(得分:0)
您只需使用您在问题中所写的确切语法即可。
示例文档: 人
{
_id: ObjectId('6023a13b756e30fec9f77b26'),
name: 'Pablo',
lastname: 'Presidente',
}
如果你做和聚合,用 $lookup
你可以删除,假设 _id
字段是这样的:
db.person.aggregate( [ { task1 }, { ... }, { taskN }, { $project: { _id: 0 }}])
通过这种方式,您还可以将其他相关文档的字段排除在聚合中;你会这样做:
db.person.aggregate( [ { task1 }, { ... }, { taskN }, { $project: { _id: 0, 'otherDocument._id': 0 }}])
性能方面我不知道这是否有好处,但撇开这一点,这就像一个魅力!
另外,您可以使用 $unset
,但我还没有尝试过。
来自docs:
<块引用>$unset 和 $project
<块引用>$unset 是 $project 阶段的别名 删除/排除字段
如果你在做一个简单的 find
,大体上是一样的,这里有一些例子的文档:
https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/#return-all-but-the-excluded-fields
希望这是useful,最好的问候!
公关