仅删除一个字段

时间:2014-02-25 23:33:04

标签: mongodb

这是一个非常简单的问题,只是一个非常糟糕的大脑冻结。在我的聚合中,我只想使用$ project删除'_id'字段,但返回其他所有内容。但是我得到了

“$ projection需要至少一个输出字段”

我认为就像:

db.coll.aggregate( [ { $match .... }, { $project: { _id: 0 }}])

由于

3 个答案:

答案 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 }}])

性能方面我不知道这是否有好处,但撇开这一点,这就像一个魅力!

更多信息:https://docs.mongodb.com/manual/reference/operator/aggregation/project/#exclude-fields-from-output-documents

另外,您可以使用 $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,最好的问候!

公关