如何在MongoDB中使用COUNT?

use*_*549 11 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"
}
Run Code Online (Sandbox Code Playgroud)

我要做的是创建一个查询,查找仅发布到1 subreddit的用户.我通过使用查询在SQL中执行此操作:

Select distinct author, subreddit from reddit group by author having count(*) = 1;
Run Code Online (Sandbox Code Playgroud)

我正在尝试在MongoDB中做类似的事情但是遇到了一些问题.我设法通过使用聚合组重新创建选择不同但我无法弄清楚如何解决HAVING COUNT部分.

这是我的查询的样子:

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

我使用$ match错了吗?

Geo*_*rov 14

您的查询应该是:

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

其中数据是具有匹配文档的一长列表.

如果你想得到一些确切的字段,它应该是这样的:

db.collection.aggregate([{
  '$group': {
    '_id': {'author': '$author', 'subreddit': '$subreddit'}, 
    'count': {'$sum': 1}, 
    'author': {'$last': '$author'}}
}, {
  '$match': {
    'count': {'$eq': 1}
}}])
Run Code Online (Sandbox Code Playgroud)