【问题标题】:MongoDb count elements of array in array by $sizeMongoDb按$ size计算数组中数组的元素
【发布时间】:2020-06-28 09:02:45
【问题描述】:

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

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

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 对数组中的元素进行计数?

【问题讨论】:

    标签: mongodb nosql nosql-aggregation


    【解决方案1】:

    您可以使用 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", []] } }
                    }
                }
            }
        }
    })
    

    【讨论】:

    • Faizul Hassan,你能帮我做一件事吗?我需要对所有歌曲进行平均/60(秒)。这是一个好方法吗? "avgOfSongTime": { "$avg": { "$map": { "input": "$album", "$map":{ "input": "$utwor", "in": { "$avg" : { $ifNull: ["$$this.dlugosc_trwania", []] } } } } } }
    【解决方案2】:

    @Kacper,

    这是你第二个问题的灵魂。

    是的,你可以通过上述任何一种方式来实现它,或者使用 unwind 并做平均。

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

    不分/秒:

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

    分/秒:

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

    【讨论】:

      【解决方案3】:

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

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

      Play

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 2015-06-21
        相关资源
        最近更新 更多