如何仅带回嵌套文档拟合过滤器

How to bring back only nested documents fitting filter

我创建了一个 mongodb 集合,其中的架构如下。

{user_id, listings: <Array of Documents>, ...}

在列表文档中,我有一个名为 status 的字段,它有两个值 publishdraft.

在 mongo shell 中,我试图仅返回具有 status:publish 的用户列表 所以我 运行 波纹管命令,我也不断返回带有 status:draft 的文档,这些文档是用户的一部分,已发布列表.

db.properties.find({'listings.status':'publish'},{'listings.status':1, _id:0})

输出:

[
  { listings: [ { status: 'draft' } ] },
  { listings: [ { status: 'publish' } ] },
  { listings: [ { status: 'draft' }, { status: 'publish' }, { status: 'draft' } ] },
  { listings: [ { status: 'publish' }, { status: 'draft' } ] },
  { listings: [ { status: 'publish' } ] }
]

如何获取只有状态为 publish 的列表的数组?

您可以使用具有 $filter:

的聚合管道
  1. $filter listings 字段仅包含状态为 publish.
  2. 的项目
  3. $match 只有 $sizelistings 大于 0 的文档。
  4. 格式
db.collection.aggregate([
  {
    $set: {
      listings: {
        $filter: {
          input: "$listings",
          as: "item",
          cond: {
            $eq: [
              "$$item.status",
              "publish"
            ]
          }
        }
      }
    }
  },
  {$match: {$expr: {$gt: [{$size: "$listings"}, 0]}}},
  {$project: {listings: 1, _id: 0}}
])

Playground example