2016-01-16 17 views
7

miei documenti simile a questa:Come fare HAVING COUNT in MongoDB?

{ 
    "_id": ObjectId("5698fcb5585b2de0120eba31"), 
    "id": "26125242313", 
    "parent_id": "26125241841", 
    "link_id": "10024080", 
    "name": "26125242313", 
    "author": "gigaquack", 
    "body": "blogging = creative writing", 
    "subreddit_id": "6", 
    "subreddit": "reddit.com", 
    "score": "27", 
    "created_utc": "2007-10-22 18:39:31" 
} 

Quello che sto cercando di fare è creare una query che trova gli utenti che hanno postato solo 1 subreddit. Ho fatto questo in SQL utilizzando la query:

Select distinct author, subreddit from reddit group by author having count(*) = 1; 

che sto cercando di fare qualcosa di simile in MongoDB, ma stanno avendo alcuni problemi atm. Sono riuscito a ricreare select distinct utilizzando il gruppo aggregato, ma non riesco a capire come risolvere la parte CONTO HAVING.

Questo è ciò che la mia domanda si presenta come:

db.collection.aggregate( 
[{"$group": 
    { "_id": { author: "$author", subreddit: "$subreddit" } } }, 
    {$match:{count:1}} // This part is not working 
]) 

sto utilizzando $ partita sbagliata?

risposta

6

vostra query dovrebbe essere come:

db.collection.aggregate([{ 
    '$group': { 
    '_id': {'author': '$author', 'subreddit': '$subreddit'}, 
    'count': {'$sum': 1}, 
    'data': {'$addToSet': '$$ROOT'}} 
}, { 
    '$match': { 
    'count': {'$eq': 1} 
}}]) 

Dove dati è una lista di lunghezza con il documento abbinato.

se si vuole ottenere un po 'di campo precisa, dovrebbe assomigliare a questo:

db.collection.aggregate([{ 
    '$group': { 
    '_id': {'author': '$author', 'subreddit': '$subreddit'}, 
    'count': {'$sum': 1}, 
    'author': {'$last': '$author'}} 
}, { 
    '$match': { 
    'count': {'$eq': 1} 
}}]) 
+0

restituisce tutte le informazioni, ma voglio solo il nome dell'autore. Come lo posso fare? – user4742549

1

eseguire il seguente gasdotto di aggregazione per ottenere il risultato desiderato:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "author": "$author", 
       "subreddit": "$subreddit" 
      }, 
      "count": { "$um": 1 }  
     } 
    }, 
    { "$match": { "count": 1 } }, 
    { 
     "$project": { 
      "_id": 0, 
      "author": "$_id.author", 
      "subreddit": "$_id.subreddit" 
     } 
    } 
]) 

Nel vostro tentativo precedente eri manca il $sum operatore di accumulo di gruppo per ottenere il conteggio dei documenti raggruppati e il passaggio finale della pipeline di aggregazione, $project, per ottenere il documento con i campi, l'autore e il subreddit desiderati come nell'istruzione di selezione SQL.

+0

Grazie per la risposta, ha funzionato perfettamente ma la risposta di anthor dude ha funzionato bene, quindi ho scelto la sua causa per primo. – user4742549