Hello,

J'ai besoin de votre cerveau pour résoudre un problème.

Le contexte : j'importe dans une collection des données avec des dates de début et de fin, voici le schéma :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
user_id : int
indicator_id : int
start_at : int
end_at : int
result : float
Les périodes de dates (start_at et end_at) pour un utilisateur (user_id) et un indicateur (indicator_id) peuvent se chevaucher, par exemple :
Import N°1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
start_at = 01-01-2017
end_at = 05-01-2017
Import N°2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
start_at = 02-01-2017
end_at = 04-01-2017
Import N°3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
start_at = 06-01-2017
end_at = 10-01-2017
Mon problème : Je dois pouvoir récupérer les données pour un utilisateur et un indicateur, sur une période, sans que les dates ne se chevauchent, mais je dois récupérer le groupe de données ou les périodes ont le plus de jours cumulés, exemple :

On peut grouper les 3 imports de cette manière :
- Import N°1 et N°3 : du 1 au 5 puis du 6 au 10, pour un total de 10 jours
- Import N°2 et N°3 : du 2 au 4 puis du 6 au 10, pour un total de 8 jours

On est donc censé récupérer les imports N°1 et 3 car c'est eux qui comportent le plus de jours au cumule.

Je débute en MongoDB, je n'ai pas encore toutes les connaissances requises pour trouver la bonne requête, si elle existe. J'ai pensé à faire un MapReduce qui serait la meilleur solution, pour pouvoir créer une collection ou on a une ligne pour un utilisateur, un indicateur et les lignes d’import correspondant.

Il y a l'algorithme X de Knuth qui peut partiellement régler le problème mais ça ne règle pas le problème puisque cet algorithme permet de trouver la bonne solution pour COUVRIR entièrement une période.

Une idée ?