2016-01-16 5 views
7

Meine Dokumente wie folgt aussehen:Wie funktioniert das mit 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" 
} 

Was ich versuche, ist eine Abfrage zu tun erstellen, die Benutzer, die nur 1 subreddit geschrieben findet. Ich tat dies in SQL, indem Sie die Abfrage mit:

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

Ich versuche, etwas ähnliches in MongoDB zu tun, aber einige Probleme atm haben. Ich habe es geschafft, Select distinct neu zu erstellen, indem ich eine Aggregatgruppe verwende, aber ich kann nicht herausfinden, wie man den HAVING COUNT Teil löst. Diese

ist das, was meine Frage wie folgt aussieht:

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

Bin ich $ passen falsch verwenden?

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

Wo Daten ist eine Länge Liste mit passendem Dokument:

Antwort

6

Ihre Abfrage sollte wie sein.

, wenn Sie einige genaue Feld erhalten möchten, sollte es so aussehen:

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

das gibt alle Informationen zurück, aber ich möchte nur den Namen des Autors. Wie kann ich das machen? – user4742549

1

Führen Sie die folgende Aggregation Pipeline um das gewünschte Ergebnis zu erhalten:

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

In Ihrem vorherigen Versuch waren Sie fehlt der $sum Gruppe Akku-Operator, um die Anzahl der gruppierten Dokumente und die endgültige Aggregation Pipeline-Schritt zu erhalten, $project, um das Dokument mit den gewünschten Feldern, Autor und Subreddit wie in Ihrer SQL-Select-Anweisung zu erhalten.

+0

Danke für die Antwort, es funktioniert perfekt, aber die Antwort des Anthor-Kumpels funktionierte auch, also wählte ich seine Ursache, weil er der Erste war. – user4742549

Verwandte Themen