MongoDB 删除或限制字段条件聚合

roh*_*ker 2 mongoose mongodb mongodb-query aggregation-framework

我在编写 find/aggregate mongo 查询时遇到一些问题,其中我的要求是获取所有文档,但条件如下:

假设我有 2 个文档:

{
  _id: 5ccaa76939d95d395791efd2,
  name: 'John Doe',
  email: 'john.doe@foobar.com',
  private: true
}

{
  _id: 5ccaa76939d95d395791efd2,
  name: 'Jane Doe',
  email: 'jane.doe@foobar.com',
  private: false
} 
Run Code Online (Sandbox Code Playgroud)

现在我试图弄清楚的查询是,如果该字段private为真,那么当我查询时,我必须获取除电子邮件字段之外的所有文档(如果private为真则不包括电子邮件字段),如下所示:

{
 _id: 5ccaa76939d95d395791efd2,
 name: 'John Doe',
 private: true
}

{
 _id: 5ccaa76939d95d395791efd2,
 name: 'Jane Doe',
 email: 'jane.doe@foobar.com',
 private: false
} 
Run Code Online (Sandbox Code Playgroud)

$redact在aggregate()中尝试过$cond,,,$$PRUNE以及$$DESCEND遇到$$REMOVE(看起来像是最新的功能),但无法获得所需的输出。请帮我查询

Ash*_*shh 8

您可以使用$$REMOVE从返回的文档中删除字段。

db.collection.aggregate([ 
  { "$addFields": {
    "email": {
      "$cond": [
        { "$eq": ["$private", true] },
        "$$REMOVE",
        "$email"
      ]
    }
  }}
])
Run Code Online (Sandbox Code Playgroud)

MongoPlayground