mongodb 使用MongoQuery过滤对象中的项目,该对象是多级的

n3schb8v  于 2023-02-03  发布在  Go
关注(0)|答案(1)|浏览(101)

请考虑以下型号。

interface Model {
  title: string
  content: string
  comments: {
    content: string
    likes?: number
    subComments: {
      parentCommentId: string
      content: string
      likes?: number
    }[]
  }[]
}

const post: Model = {
  title: 'test',
  content: 'content',
  comments: [
    {
      content: 'level2',
      likes: 3,
      subComments: [
        {
          parentCommentId: '1',
          content: 'level3',
          likes: 3,
        },
      ],
    },
    {
      content: 'level2',
      likes: 3,
      subComments: [
        {
          parentCommentId: '1',
          content: 'level3',
          likes: 5,
        },
        {
          parentCommentId: '1',
          content: 'level3',
          likes: 5,
        },
      ],
    },
  ],
}

假设我们有一个帖子,其中的评论包含子评论。
subComment的级别为3,但深度是固定的。
有没有办法用MongoClient过滤掉具有可选键“like”并且值大于3的subComments

n9vozmp4

n9vozmp41#

我不知道你到底想要什么样的输出,但是你可以尝试像这个例子一样只使用到find查询的投影:
这里有两个$filter和一个map。
$map将每个对象放入comments数组,然后:

  • 按原样设置内容:content: "$$comment.content"
  • 将子注解设置为一个数组,该数组仅由喜欢数大于3的一个对象过滤。
    • 我没有添加likes,因为它看起来不一致,但可以使用likes: "$$comment.likes"添加

这将生成一个数组,其中只有超过3个like的对象。
这意味着它可以产生一个空的subComments数组。所以$map的结果被用于另一个$filter,以获得subComments不为空的对象(即至少有一个评论有超过3个赞)。

db.collection.find({},
{
  title: 1,
  content: 1,
  comments: {
    $filter: {
      input: {
        $map: {
          input: "$comments",
          as: "comment",
          in: {
            content: "$$comment.content",
            subComments: {
              $filter: {
                input: "$$comment.subComments",
                as: "subComment",
                cond: {
                  $gt: [
                    "$$subComment.likes",
                    3
                  ]
                }
              }
            }
          }
        }
      },
      cond: {
        $ne: [
          "$$this.subComments",
          []
        ]
      }
    }
  }
})

例如here
在聚合查询中使用$project也是一样的:example

相关问题