2017-08-26 7 views
0

J'ai un MongoDB mis en place comme suit:MongoBD numéro de comte d'articles avec l'auteur

{_id: id, 
    'article_information': ... 
    'AU':[list of authors] 
    ..other fields... 
} 

Je suis en train d'utiliser ensemble pour compter le nombre de documents (articles) par chaque auteur. Dupliquer sont OK à ce stade. Combiner les auteurs est une autre couche de traitement, en raison de noms changeants, différentes orthographes de noms avec des accents et ainsi de suite.

Je veux une sortie similaire à ce qui suit:

'Author 1': Count of documents mentioning author 1, 
      ... 
'Author N': Count of documents mentioning author n, 

Le ci-dessous tentative donne une liste vide:

collection.aggregate([{"$group":{"_id":'AU',"count":{"$sum":1}}}]) 

Je pensais que l'erreur peut-être parce $AU est une liste de chaînes, mais db.collection.distinct('AU') renvoie une liste de chaînes, pas une liste de listes.

Dans la syntaxe de style SQL, je vois la requête comme suit dans une boucle for qui itère sur une liste d'auteurs. Je ne suis pas sûr de savoir comment écrire cela dans Mongo.

SELECT * from collection WHERE author IN AUTHOR_LIST 

Répondre

2

Vous pouvez $unwind (docs) la collection d'abord par auteur, puis $group comme vous faites en ce moment:

pipeline = [{"$unwind": "$AU"}, 
      {"$group": {"_id": "$AU", "count": {"$sum": 1}}}] 
db.collection.aggregate(pipeline) 

Vous avez un exemple dans le pymongo aggregation framework docs.