Dans mongodb, si nous voulons prendre le premier ou le dernier document de la phase de groupes, les opérateurs FIRST et LAST seront utiles. Je souhaite regrouper la collection en fonction de _id:"$department" et également prendre le document LAST et le document LAST-1. Y'a-t-il une quelconque façon de réussir cela.

0
Nandy 10 févr. 2020 à 17:38

1 réponse

Meilleure réponse

Supposons que vous ayez cette collection :

[
  { department: "HR", employees: 20 },
  { department: "Finance", employees: 30 },
  { department: "Sales", employees: 5 },
  { department: "IT", employees: 50 }
]

Ensuite, vous pouvez exécuter cette agrégation :

db.collection.aggregate([
   { $sort: { department: 1 } },
   {
      $group: {
         _id: null,
         employees: { $sum: "$employees" },
         all_departments: { $push: "$department" }
      }
   },
   {
      $set: {
         last_departments: {
            $concatArrays: [
               [{ $arrayElemAt: ["$all_departments", -1] }],
               [{ $arrayElemAt: ["$all_departments", -2] }]
            ]
         }
      }
   }
])

Mongo Aire de jeux

Mettre à jour

Avec $slice c'est encore plus court :

db.collection.aggregate([
   { $sort: { department: 1 } },
   {
      $group: {
         _id: null,
         employees: { $sum: "$employees" },
         all_departments: { $push: "$department" }
      }
   },
   { $set: { last_departments: { $slice: ["$all_departments", -2] } } }
]) 
1
Wernfried Domscheit 13 févr. 2020 à 06:53