簡體   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