mongodb - Mongo 聚合,用该内部数组的计数替换内部数组结果数组

标签 mongodb aggregation-framework projection

<分区>

我正在研究一种社交网络模式,并尝试使用聚合框架在管道期间更改文档以总结其中的一部分,特别是用数组的大小替换数据数组。

例如,给定这些原始文档,每个文档都有一个帖子数组,每个帖子都有一个点赞数组:

{ "_id": 1, "posts": [
  {
    "content": "foobar", "likes": [ "11", "12", "13" ]
  }
] }
{ "_id": 2, "posts": [
  {
  "content": "foobar2", "likes": [ "22", "23" ]
  }
] }
{ "_id": 3, "posts": [
  {
  "content": "foobar3", "likes": [ "33" ]
  }
] }

(可以直接输入 mongoimport)

在现实世界中,posts 数组中会有很多元素,likes 数组中会有更复杂的元素。我需要返回带有点赞数的文档,而不是实际点赞本身,例如

{ _id: 1, posts: [
  { content: 'foobar', likeCount: 3 }
] },
{ _id: 2, posts: [
  { content: 'foobar2', likeCount: 2 }
] },
{ _id: 3, posts: [
  { content: 'foobar3', likeCount: 1 }
] }

$project 聚合阶段似乎很合适,但我无法获得产品所需的结果。例如

db.getCollection('test').aggregate([
    {
        $project: {
            "posts.likeCount": { $size: "$posts.likes" }
        }
    }
])

给予:

{
    "_id" : 2,
    "posts" : [ 
        {
            "likeCount" : 1
        }
    ]
}
{
    "_id" : 3,
    "posts" : [ 
        {
            "likeCount" : 1
        }
    ]
}
{
    "_id" : 1,
    "posts" : [ 
        {
            "likeCount" : 1
        }
    ]
}

$project 表达式中的 $posts.likes 用法似乎特别不对,因为 $posts 是一个数组。

我的输出文档如何包含此内部数组的聚合(计数),同时仍保持原始文档的结构?

我尝试了 $unwind$replaceRoot 阶段来尝试找到解决方案,但最终得到的结构不太具体,失去了原始结构的周围字段。我一直在阅读 MongoDB 引用文档,搜索 SO 和其他地方,但还没有找到解决方案。

最佳答案

您可以尝试下面的聚合查询。 $map 迭代 posts 数组并使用 $size 计算 likes 的计数。

db.collection.aggregate({
  "$project": {
    "posts": {
      "$map": {
        "input": "$posts",
        "as": "post",
        "in": {
          "content": "$$post.content",
          "likeCount": {
            "$size": "$$post.likes"
          }
        }
      }
    }
  }
})

关于mongodb - Mongo 聚合,用该内部数组的计数替换内部数组结果数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46424510/

相关文章:

java - 在 Java 中列出 mongoDB 的数据库时对 forEach 的引用不明确

mongodb - 如何在 Apache Airflow 中连接到 Mongodb?

mongodb - $sum 有多个条件

mongodb - 使用另一个字段的值更新 MongoDB 字段

gis - H3 六边形在 kepler.gl 中使用交换的经纬度进行渲染

java - Spring Boot中未创建MongoDB唯一索引

java - 使用 Java 修改 MongoDB 数组

MongoDB:使用 $in 进行编辑的聚合失败

c# - Linq投影问题

sql - SQL 中投影的语法