Mongoose 聚合内部查找按字段分组

Posted

技术标签:

【中文标题】Mongoose 聚合内部查找按字段分组【英文标题】:Mongoose aggregate internal lookup grouping by field 【发布时间】:2018-09-01 05:05:28 【问题描述】:

我正在尝试对所有不同的字段进行分组,然后查找另一个表,问题是我在查找中为同一用户添加了太多结果,所以我想知道如何在内部对这些结果进行分组然后在下一阶段,将另一个查找添加到不同的表。 目前我有以下代码:

Post.aggregate([
     "$group" : "_id" :  "id_fanpage": "$id_fanpage" ,"total":  $sum: 1   ,
    
      "$lookup": 
        "from": "v3_post_reaccion_angry",
        "localField": "_id.id_fanpage",
        "foreignField": "id_fanpage",
        "as": "resultingAngries"
      
    ,
    
      "$lookup": 
        "from": "v3_post_reaccion_compartir",
        "localField": "_id.id_fanpage",
        "foreignField": "id_fanpage",
        "as": "resultingCompartir"
      
    
  ]).exec(function(err, results)
    console.log(results);
    return results
  ).then(success(res))

我要做的是通过“id_fanpage”区分Post行,然后通过返回的id_fanpage加入另一个表,这基本上按预期工作,结果是这样的:


        "_id": 
            "id_fanpage": "5a63a96d1aa940ca0ada1c82"
        ,
        "total": 831,
        "resultingAngries": [
            
                "_id": "5a71ccda1aa940dd154caf83",
                "id_post": "5a71ccda1aa940dd154caf82",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": 345346565665,
                "facebook_usuario_nombre": "AAAAAAAAAAAAAAAAA"
            ,
            
                "_id": "5a71cd6b1aa940dd154ddb43",
                "id_post": "5a71cd6b1aa940dd154ddb40",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "44444444444444444",
                "facebook_usuario_nombre": "XXXXXXXXXXXXXXXX"
            ,
            
                "_id": "5a71d7f61aa940dd156b60f4",
                "id_post": "5a71d7f61aa940dd156b60e9",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "asdf12345232421",
                "facebook_usuario_nombre": "YYYYYYYYYYYYYY"
            ,
            
                "_id": "5a71cde11aa940dd154ec514",
                "id_post": "5a71cde11aa940dd154ec513",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "asdf2345234555",
                "facebook_usuario_nombre": "ZZZZZZZZZZZZZZ"
            ,
            
                "_id": "5a71cdcb1aa940dd154e917a",
                "id_post": "5a71cdcb1aa940dd154e9178",
                "id_fanpage": "5a63a96d1aa940ca0ada1c82",
                "facebook_usuario_id": "44444444444444444",
                "facebook_usuario_nombre": "XXXXXXXXXXXXXXX"
            
        ]
        

现在的问题是,我想通过 facebook_usuario_id 将结果中的所有结果分组,并且还能够将其添加到下一次查找中,但据我所知,我无法在第一次查找后使用组而不影响下次查找。 所以结果应该是:


        "_id": 
            "id_fanpage": "5a63a96d1aa940ca0ada1c82"
        ,
        "total": 831,
        "resultingAngries": [
            
                "_id": "this is my user id 1111111111",
                "count": N,
            ,
            
                "_id": "this is my user id 2222222222",
                "count": Y,
            
         ],
        "resultingLikes": [
            
                "_id": "this is my user id 1111111111",
                "count": N,
            ,
            
                "_id": "this is my user id 2222222222",
                "count": Y,
            
         ],
   ,
   
    "_id": 
            "id_fanpage": "5a63a96d1aa942345wedf23455s"
        ,
        "total": 20,
        "resultingLikes": [
            
                "_id": "this is my user id 1111111111",
                "count": N,
            ,
            
                "_id": "this is my user id 2222222222",
                "count": Y,
            
         ],
   ,
     "resultingAngries": [
        
            "_id": "this is my user id 1111111111",
            "count": N,
        ,
        
            "_id": "this is my user id 2222222222",
            "count": Y,
        
     ],

等等。 我已经看过聚合和查找,但不确定 $addToSet 是否可以做到,因为到目前为止我无法在内部分组,所以应用 addToSet 给我带来了困难。帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在 $lookup 之间插入以下三个阶段。

下面的步骤$unwindresultingAngries数组后跟第一个$group计算facebook_usuario_idid_fanpage的不同组合,第二个$group$pushcountfacebook_usuario_id返回进入resultingAngries数组。

  "$unwind":"$resultingAngries",
  "$group":
    "_id":
      "id_fanpage":"$_id.id_fanpage",
      "facebook_usuario_id":"$resultingAngries.facebook_usuario_id"
    ,
    "total":"$first":"$total",
    "count":"$sum":1
  ,
  "$group":
    "_id":"id_fanpage":"$_id.id_fanpage",
    "total":"$first":"$total",
    "resultingAngries":
      "$push":
        "_id":"$_id.facebook_usuario_id",
        "count":"$count"
      
    
  

【讨论】:

facebook_usuario_id 在另一个集合中,在 Post 集合中我有 _id, id_fanpage .. 在第二个集合中我有我的 facebook_usuario_id 与 id_fanpage 的 Post 集合有关,所以你建议添加这个阶段在第一次查找之前对吗?还是在第一次查找之后?我正在尝试,但在这两种情况下我都收到了一个空的 [ ] 你认为可能是什么? 尝试在第一次查找后添加它。让我用您提供的数据进行验证。 它可以工作,但如果我添加更多查找时间增长并且结果开始不是很准确,那么只有一次查找才能工作,因此通过一次查找完成,我可以在不同的功能中管理其余部分,然后转换数据并输出最终结果。我尝试添加第一个阶段,因为我有它,然后是查找,然后添加了您的三个阶段 是的,链接查找不是一个好主意,因为它不能很好地扩展。保持单独的查找并在客户端代码中进行聚合。 非常非常非常感谢,这是我认为我尝试过的最难的查询。非常感谢。

以上是关于Mongoose 聚合内部查找按字段分组的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 按标签聚合分组项目

Mongoose 聚合查找 - 如何按特定 id 过滤

你如何从 Mongo 日期字段中获取 DayHours?

你如何从 Mongo 日期字段中获取 DayHours?

在猫鼬聚合框架中按日期排序

Mongoose 聚合不按输入日期过滤