使用MongoDB投影数组

Gre*_*nih 6 mongodb mongodb-query aggregation-framework

我正在使用MongoDB的聚合管道,以我想要的形式获取我的文档.作为聚合的最后一步,我$project用来将文档放入最终形式.

但我在投影和子文档数组时遇到了麻烦.这是我目前从aggrgation得到的:

{
  "_id": "581c8c3df1325f68ffd23386",
  "count": 14,
  "authors": [
    {
      "author": {
        "author": "57f246b9e01e6c6f08e1d99a",
        "post": "581c8c3df1325f68ffd23386"
      },
      "count": 13
    },
    {
      "author": {
        "author": "5824382511f16d0f3fd5aaf2",
        "post": "581c8c3df1325f68ffd23386"
      },
      "count": 1
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想$projectauthors阵列,使得回报将是这样的:

{
  "_id": "581c8c3df1325f68ffd23386",
  "count": 14,
  "authors": [
    {
      "_id": "57f246b9e01e6c6f08e1d99a",
      "count": 13
    },
    {
      "_id": "5824382511f16d0f3fd5aaf2",
      "count": 1
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我将如何实现这一目标?

小智 14

我一直遇到同样的问题,刚刚找到了一个简单而优雅的解决方案,但没有在任何地方提到过,所以我想我会在这里分享:

您可以使用 $map 迭代数组并投影每个作者。对于给定的结构,聚合应该看起来像这样

db.collectionName.aggregate([
  $project: {
    _id: 1,
    count:1,
    authors: {
      $map: {
        input: "$authors",
        as: "author",
        in: {
          id: "$$author.author.author",
          count: $$author.author.count
        }
      }
    } 
  }
])
Run Code Online (Sandbox Code Playgroud)

希望这对像我一样正在寻找的人有所帮助:)


car*_*619 9

您可以在投射后将阵列展开并再次缠绕它.像这样的东西:

db.collectionName.aggregate([
{$unwind:'$authors'},
{$project:{_id:1,count:1,'author.id':'$authors.author.author','author.count':'$authors.count'}},
{$group:{_id:{_id:'$_id',count:'$count'},author:{$push:{id:'$author.id',count:'$author.count'}}}},
{$project:{_id:0,_id:'$_id._id',count:'$_id.count',author:1}}
])
Run Code Online (Sandbox Code Playgroud)

上面的输出将是:

{ 
    "_id" : "581c8c3df1325f68ffd23386", 
    "author" : [
        {
            "id" : "57f246b9e01e6c6f08e1d99a", 
            "count" : 13.0
        }, 
        {
            "id" : "5824382511f16d0f3fd5aaf2", 
            "count" : 1.0
        }
    ], 
    "count" : 14.0
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有没有 $unwind 的解决方案? (2认同)