2016-01-16 10 views
7

Belgelerim şuna benzer: Ben bunu yapmaya çalışıyorum neMongoDB'de HAVING COUNT nasıl yapılır?

{ 
    "_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" 
} 

sadece 1 subreddit gönderilen kullanıcıları bulan bir sorgu oluşturmak olduğunu. Ben sorguyu kullanarak SQL yaptılar: Ben MongoDB benzer bir şey yapmaya çalışıyorum ama atm bazı sorunları yaşıyorsanız

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

. Toplu grup kullanarak farklı seçimlerini yeniden oluşturmayı başardım ancak HAVING COUNT parçasını nasıl çözeceğimi anlayamıyorum.

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

Ben $ maçı yanlış kullanıyor muyum:

Bu gibi benim sorgu görünüyor nedir?

cevap

6

Sorgunuzda olması gerektiği gibi:

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

Nerede veri eşleşti belgeyle bir uzunlukta listesidir. Bazı kesin alanını almak istiyorsanız

, bu gibi görünmelidir: öyleydin önceki girişimde

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

:

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

bu, tüm bilgileri döndürür, ancak yalnızca yazarın adını istiyorum. Bunu nasıl yapabilirim? – user4742549

1

istenilen sonucu elde etmek için aşağıdaki toplama boru hattı çalıştırın gruplandırılmış belgelerin ve son toplama boru hattı adımının sayısını almak için $sum grup akümülatör operatörünü kaçırma, $project, belgeyi yalnızca istenen alanlarla, SQL select deyiminizdeki gibi yazar ve subreddit ile.

+0

Cevabınız için teşekkürler, mükemmel çalışıyor ama anthor dude'un cevabı da işe yaradı, bu yüzden ilk önce onun nedenini seçtim. – user4742549