繁体   English   中英

Mongodb/Mongoose - 聚合以将同一集合中的所有匹配文档分组到一个数组中

[英]Mongodb/Mongoose - Aggregation to group all matching docs in same collection in an array

我在一个场景中,我想找到一些类似的文档并将它们分组到一个数组中。 这是一个更好地说明这个想法的例子:

收藏文件:

{
   _id: 0,
   enabled: false,
   name:"name A",
   amounts:{ salary: 100 },
   field_condition: "No",
   created_A: "2020-07-01"
}

{
   _id: 1,
   enabled: false,
   name:"name A",
   amounts:{ salary: 100 },
   field_condition: "Yes",
   created_A: "2020-08-01"
}

{
   _id: 2,
   enabled: false,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "Yes",
   created_A: "2020-09-01"
}

{
   _id: 3,
   enabled: true,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01"
}



{
   _id: 4,
   enabled: false,
   name:"name B",
   amounts:{ salary: 100 },
   field_condition: "No",
   created_A: "2020-07-01"
}

{
   _id: 5,
   enabled: false,
   name:"name B",
   amounts:{ salary: 100 },
   field_condition: "Yes",
   created_A: "2020-08-01"
}

{
   _id: 6,
   enabled: false,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "Yes",
   created_A: "2020-09-01",

}

{
   _id: 7,
   enabled: true,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01"
}

我想找到启用字段为true且 field_condition 等于No的所有文档,这将导致这两个文档:

{
   _id: 3,
   enabled: true,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01"
}

{
   _id: 7,
   enabled: true,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_At: "2020-10-01"
}

然后,我想递归地找到前几个月的文件,匹配name字段, enabled: falsefield_condition: "Yes"直到我找到一个 where field_condition: "No"并停止。 然后我想把上个月找到的文件放在实际文件的数组中:

[ 
 {
   _id: 3,
   enabled: true,
   name:"name A",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_A: "2020-10-01",
   relatedDocs: [
      {
         _id: 1,
         enabled: false,
         name:"name A",
         amounts:{ salary: 100 },
         field_condition: "Yes",
         created_A: "2020-08-01"
      },

      {
         _id: 2,
         enabled: false,
         name:"name A",
         amounts:{ salary: 100 }, 
         field_condition: "Yes",
         created_A: "2020-09-01"
      }
   ]
},


{
   _id: 7,
   enabled: true,
   name:"name B",
   amounts:{ salary: 100 }, 
   field_condition: "No",
   created_At: "2020-10-01",
   relatedDocs: [
      {
         _id: 1,
         enabled: false,
         name:"name B",
         amounts:{ salary: 100 },
         field_condition: "Yes",
         created_A: "2020-08-01"
      },

      {
         _id: 2,
         enabled: false,
         name:"name B",
         amounts:{ salary: 100 }, 
         field_condition: "Yes",
         created_A: "2020-09-01"
      }
   ]
 }
]

我非常努力地使用$lookup聚合,但无法让它工作。 非常感谢您的帮助。 谢谢!

这不是直截了当的实现。

您可以按所需顺序对整个数据进行排序。

db.collection.aggregate([
  {
    "$addFields": {//add a field to sort
      "consider": {
        $and: [
          {
            "$eq": [
              "$enabled",
              true
            ]
          },
          {
            $eq: [
              "$field_condition",
              "No"
            ]
          }
        ]
      },
      "date": {
        "$dateFromString": {
          "dateString": "$created_A"
        }
      }
    }
  },
  {
    $sort: { //sort the data
      "consider": -1,
      "date": -1
    }
  },
  {
    $group: {//group by name and data will have sorted result
      "_id": "$name",
      "data": {
        $push: "$$ROOT"
      },
      "considerDoc": {
        $first: "$$ROOT"
      }
    }
  }
])

如果您确定每个月都会有一个条目并且只有最近几个月在该字段条件中有Yes ,那么您可以在另一个阶段对其进行过滤。

否则,您必须在后端代码中执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM