2016-01-16 19 views
7

tài liệu của tôi trông như thế này:Làm cách nào để thực hiện COUNT trong 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" 
} 

Những gì tôi đang cố gắng làm là tạo ra một truy vấn mà tìm thấy những người dùng đưa lên chỉ có 1 subreddit. Tôi đã làm điều này trong SQL bằng cách sử dụng truy vấn:

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

Tôi đang cố gắng làm điều gì đó tương tự trong MongoDB nhưng đang gặp một số vấn đề. Tôi đã quản lý để tạo lại lựa chọn riêng biệt bằng cách sử dụng nhóm tổng hợp nhưng tôi không thể tìm ra cách để giải quyết phần COUNT HAVING.

Đây là những gì truy vấn của tôi trông giống như:

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

Tôi sử dụng $ trận đấu sai?

Trả lời

6

truy vấn của bạn nên được như:

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

đâu dữ liệu là danh sách một chiều dài với tài liệu phù hợp.

nếu bạn muốn nhận được một số lĩnh vực chính xác, nó sẽ giống như thế này:

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

trả về tất cả thông tin, nhưng tôi chỉ muốn tên tác giả. Làm thế nào tôi có thể làm điều đó? – user4742549

1

Chạy đường ống kết hợp sau đây để có được kết quả mong muốn:

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

Trong nỗ lực trước đó của bạn, bạn đã thiếu nhà điều hành tích lũy nhóm $sum để nhận số lượng tài liệu được nhóm và bước đường ống tổng hợp cuối cùng, $project, để lấy tài liệu chỉ với các trường mong muốn, tác giả và subreddit như trong câu lệnh chọn SQL của bạn.

+0

Cảm ơn câu trả lời, nó hoạt động hoàn hảo nhưng câu trả lời của anthor dude làm việc cũng vì vậy tôi choicen nguyên nhân của mình, ông là người đầu tiên. – user4742549

Các vấn đề liên quan