如何对同一集合中不同文档的值求和?

Posted

技术标签:

【中文标题】如何对同一集合中不同文档的值求和?【英文标题】:How can I sum values from different documents in the same collection? 【发布时间】:2021-04-01 00:29:01 【问题描述】:
I have photos with an array of likes. I am using mongoose as a db. I want to sum all the numeric values in the likes count of photo collection.
    exports.getAnalytics = (req, res) => 
  if (!req.user) 
    return res.redirect('/login');
  
  Campaign.findOne(slug:req.params.slug, (err, campaign) => 
    PhotoEntries.find( CampaignId: campaign._id, ['Photo','Name', 'done' ,'likes_count', ], sort: _id: -1 , function(err, photos) 
      
      PhotoEntries.countDocuments(CampaignId: campaign._id , function (err, count)  
          PhotoEntries.aggregate([
            
              $group: 
                _id: "$CampaignId",
                Totallikes:  $sum: "$likes_count" 
              
            
          ]) 
    if(req.user)
      console.log(photos);
      res.render('admin/analytics', 
        title: 'Analytics',
        campaign: campaign,
        photolist : photos, 
        Count:count ,
        Totallikes: Totallikes  
        );
    
  // 
  // ])

  );
  );
  );
     

但是它不起作用。错误是Arguments must be aggregate pipeline operators. 我怎样才能做到这一点? 这是我的架构代码。 var photoSchema = 新架构( 名称:类型:字符串, 电子邮件:类型:字符串, 照片:类型:字符串, 说明:类型:字符串, 电话号码:类型:字符串, 活动 ID: 类型:Schema.Types.ObjectId, ref: '广告系列', ,

        done: 
          type: Boolean  ,
      ,
    
      likes_count: Number ,default: 0,
        likedBy: [
          
              type:Schema.Types.ObjectId,
              ref: "User"
          
      ], 
      );
      

我需要将likes_count 字段添加到集合中的所有文档中。

【问题讨论】:

您能否在您的问题和预期结果中添加照片集架构。 你想做什么?您需要在集合中添加新字段吗?还是只需要通过聚合进行计数和检索?你的问题不清楚。 通过聚合只计算和检索 【参考方案1】:

你错过了输入_id, 按指定的_id 表达式对输入文档进行分组,对于每个不同的分组,输出一个文档。每个输出文档的_id 字段包含唯一的按值分组。更多信息请参考$group

PhotoEntries.aggregate([
  
    $group: 
      _id: null,
      Totallikes:  $sum: "$likes_count" 
    
  
])

Playground

【讨论】:

什么是id:null是什么意思,还是看不懂? 它需要输入,它将如何知道按此字段分组,您可以指定_id: "$CampaignId"这将按该ID分组,--但现在我们需要对所有文档进行分组所以_id: null这个将对所有文档进行分组。有关更多信息,请从答案中提供的 $group 链接中获取示例演示。 我添加了但无法将 Totallikes 变量发送到前端。它显示错误 Totallikes undefined $match 阶段以上可能没有匹配文档,删除该阶段并重新测试。 我在上面编辑过,请查看完整路线

以上是关于如何对同一集合中不同文档的值求和?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 MongoDB 集合中字段的不同值求和(利用 mongoose)

如何使用 JS 获取不同的值并在 JSON 上求和

MongoDB/Mongoose:对同一集合中不同类型的文档使用不同的方案

如何对不同列的值求和

聚合后如何有条件地对来自不同列的值求和?

如何对 MongoDB 集合中所有文档的键值求和