Bonjour à tous

Je travaille sur un programme de recommandations de produits (avec Mahout Taste) pour lequel j'ai besoin de générer certains métriques d'utilisation.

Un de ces métriques est le nombre de produits achetés à la suite d'une recommandation.

Je travaille avec MongoDB en Java, mais surtout l'algorithme d’agrégation que je n'arrive pas à concevoir.

--

Je commence par présenter le modèle simplifié, j'ai deux collections :

- records, contient l'historique des achats
- identifiant utilisateur
- identifiant produit
- timestamp (en secondes)

- history, historique des recommandations produites par le système
- identifiant utilisateur
- liste d'identifiants produits
- l'ObjectId fait office de timestamp (en secondes aussi du coup)

--

Je que je voudrais obtenir c'est, par période temps (disons une semaine pour l'exemple), combien de produits ont été achetés suite à une recommandation dans la période précédente

par exemple:
user#40 à acheté produit#85 mercredi 1er janvier 2014 12:45:12, ce produit lui a été recommandé le 26 décembre 2013 18:12:00
=> +1 pour la semaine du Lundi 30 décembre 2013 (identifié par le timestamp 1388358000, Lundi 30 décembre 2013 à minuit)

user#54 a acheté produit#185 dimanche 5 janvier 2014, ce produit lui a été recommandé le 4 janvier 2014
=> +1 pour la semaine du Lundi 30 décembre 2013

user#12 a acheté produits#12 dimanche 5 janvier 2014, ce prduit lui a été recommandé le 26 décembre 2013
=> ça ne compte pas, recommandé il y a plus d'une semaine

--

Et je ne sais pas exactement comment faire cette requête.

Pour le moment j'ai une approche linéaire inutilisable en production (même avec un cache) :

- récupérer la liste de tous les achats dans la collection records
- pour chaque achats
- chercher dans la collection history un document qui valide:
- objectid entre achat.time-1 semaine et achat.time
- userid = achat.userid
- productids contient achat.productid
- si au moins un document valide, incrémenter un compteur (dans une map dans les clefs sont les timestamp de début de semaine)

Ça marche très bien, seulement 2min 30 d’exécution pour un base de 21 mille achats, c'est pas viable

--

Tout indication est la bienvenue. Pour moi le problème étant en particulier l'utilisation de deux collections.

Merci

----

Edit: je sens bien que ça ne sera pas possible en une requete (pas avec MongoDB), mais il y a surement mieux que mes N+1 ...