MongoDb 按 $size 计算数组中的数组元素

MongoDb count elements of array in array by $size

当一个数组在另一个数组中时,我需要帮助来计算它的元素。

我的命令,当我尝试select第二个数组时,

db.artysci.aggregate([
   {
      $project: {
          _id:0,
         nazwa: 1,
         nazwisko: 1,
         numberOfSongs: { "album": {$size: "$utwor"}}
              
      }
   }
] )

网格:

db.artysci.insert({
    imie: 'Laurie',
    nazwisko: 'Adkins',
    rok_debiutu: 2006,
    kraj_pochodzenia: ['Wielka Brytania'],
    gatunek: 'neo soul',
    album: [{
            tytul:"19",
            rok_edycji:2007,
            gatunek: 'pop',
            typ_nosnika: 'CD',
            utwor: [{
                    numer: 1,
                    tytul_utworu: 'Daydreamer',
                    dlugosc_trwania: 3.41
                    },
                    {
                    numer: 2,
                    tytul_utworu: 'Best for Last',
                    dlugosc_trwania: 4.19
                    },
                    {
                    numer: 3,
                    tytul_utworu: 'Chasing Pavements',
                    dlugosc_trwania: 3.31
                    }
                    ]
            }]
          })

按 $size 计数时的输出:"$album",

{ 
    "nazwisko" : "Adkins", 
    "numberOfSongs" : {
        "album" : NumberInt(3)
    }
}

如何按 $size 计算数组中数组的元素?

你可以用Map来实现,然后总结一下。有效..

db.artysci.aggregate({
    "$project": {
        _id: 0,
        nazwa: 1,
        nazwisko: 1,
        "numberOfAlbums": { "$size": { $ifNull: ["$album", []] } },
        "numberOfSongs": {
            "$sum": {
                "$map": {
                    "input": "$album",
                    "in": { "$size": { $ifNull: ["$$this.utwor", []] } }
                }
            }
        }
    }
})

您可以使用 $unwind$group 来获取计数。

db.collection.aggregate([
  {
    $unwind: "$album"
  },
  {
    $unwind: "$album.utwor"
  },
  {
    $group: {
      _id: 0,
      total: {
        $sum: 1
      }
    }
  }
])

Play

如果您需要更多信息,请将其添加到您的问题中。

@Kacper,

这是你第二个问题的答案。

是的,你可以通过任何一种方式实现它,使用上述方法或使用展开并进行平均..

让我们看一个使用 unwind 的例子:

没有divide/second:

 db.notifications.aggregate([
       { $unwind: "$album" },
       { $unwind: "$album.utwor" },
       {
          $group: {
             _id: "$_id",
             avgDuration: { $avg: "$album.utwor.dlugosc_trwania" }
          }
       },
    ]);

与divide/second:

db.notifications.aggregate([
   { $unwind: "$album" },
   { $unwind: "$album.utwor" },
   {
      $group: {
         _id: "$_id",
         avgDuration: { $avg: { $divide: ["$album.utwor.dlugosc_trwania", 60] } }
      }
   },
]);