MongoDB groupe par tableau intérieure-éléments
J'ai une liste d'articles, et chacun d'eux a une propriété de tableau qui répertorie les différentes personnes mentionnées à eux:
_id: {
$oid: "52b632a9e4f2ba13c82ccd23"
},
providerName: "The Guardian",
url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm",
subject: "The Waterboys – review",
class_artist: [
"paul mccartney"
]
J'ai essayé (en vain) d'obtenir une liste de tous les artistes (class_artist
), basé sur le nombre d'articles qu'ils ont été marquées dans les dans les 7 derniers jours.
J'ai été aussi loin que:
var date = new Date();
date.setDate(date.getDate() - 7);
db.articles.group({
key: { class_artist: 1 },
cond: { class_date: { $gt: date } },
reduce: function ( curr, result ) { result.cnt++; },
initial: { cnt : 0 }
}).sort({cnt: -1});
Mais malheureusement, il ne compte pas entre eux sur la base du tableau de valeurs, mais par la matrice de compositions (qui est, des listes d'artistes).
J'ai essayé d'utiliser le $unwind
de la fonction, mais n'ont pas été en mesure de le faire fonctionner.
Vous devez vous connecter pour publier un commentaire.
Quel cadre utilisez-vous? Ce n'est pas MongoDB shell et ressemble un peu bizarre wrapper autour de MapReduce. Dans ce cas $détendez-vous ne serait pas disponible, et que vous avez besoin pour l'utilisateur dans le l'agrégation cadre. Voici ce que vous voulez dans le shell mongo:
De manière efficace:
Et la grande chose au sujet d'agrégation est que vous pouvez construire progressivement les étapes de voir ce qui se passe.
Secouer et faire cuire dans votre propre pilote de mise en oeuvre ou l'ODM cadre que nécessaire.
group()
de commande qui est implémenté en JavaScript et est antérieure à l'Agrégation Cadre. Voir aussi: MongoDB agrégation de comparaison: groupe de(), $groupe et MapReduce.