具有不同的 Mongodb 聚合

标签 mongodb

作为 Mongodb 的新手,我搜索了一个答案,但没有找到这个问题的答案。如何将 distinct 选项添加到聚合查询? 我有一个谱系数据库,我想在其中找到在特定年份繁殖最多窝的育种者。我有一个字段“DOB”,在其他查询中我可以找到“Smith”在 2013 年繁殖了多少窝:

db.ped.distinct("DOB", {$and:[{"Breeder":{$regex: /Smith/}}, {"DOB-Year":2013}]}).length

我可以算出有多少窝,因为同一个饲养员出生日期相同的多只狗应该来自同一窝。 我想将它与聚合结合使用,但一直无法弄清楚查询会是什么样子。这是我到目前为止使用的,但由于每个文件都是一只狗,所以我得到了当年饲养员饲养的所有狗。

db.ped.aggregate( [
    {$match : {"DOB-Year" : 2013}},
    {$group : {_id : "$Breeder", "count" : {$sum : 1}}},
    {$sort : {"count" : -1}},
    {$limit : 15}
] )

有没有办法在聚合查询中使用$distinct
谢谢。

回应马里奥

我认为这不是我想要的结果。我不确定我到底得到了什么,但看看我在这里得到了什么。我已经清理了数据。

> db.ped.aggregate([
...     {
...         $match: {
...             "DOB-Year": 2014
...         }
...     },
...     {
...         $group: {
...             _id: {
...                 "Breeder": "$Breeder",
...                 "DOB": "$DOB"
...             },
...             "count": {
...                 $sum: 1
...             }
...         }
...     },
...     {
...         $sort: {
...             "count": -1
...         }
...     },
...     {
...         $limit: 1
...     }
...  ])
{ "_id" : { "Breeder" : "Smith", "DOB" : "09/15/2014" }, "count" : 9 }

> db.ped.distinct("DOB", {"Breeder":{$regex: /Smith/},"DOB-Year":2014}).length
5

很明显,我真正想要的第一段代码应该是 Smith 的 5。 这是我正在使用的数据示例。

{
    "_id" : ObjectId("55df4a8cc0bfbb6622ae8395"),
    "PedID" : 54321,
    "RegNum" : "12345",
    "RegName" : "My Dog Name",
    "Owner" : "Smith",
    "Sex" : "Dog",
    "Color" : "Black & Tan",
    "Sire" : "My Boy Bob",
    "Dam" : "My Girl Betty",
    "Breeder" : "Smith",
    "DOB" : "10/18/2014",
    "DOB-Year" : 2014
}

最佳答案

由于您也愿意按DOB 进行分组,因此您应该将其包含在group_id 中,如下所示:

db.ped.aggregate([
    {
        $match:{"DOB-Year":2014}
    },
    {
        $group: {
            _id: {
                "Breeder": "$Breeder",
                "DOB": "$DOB"
            },
            "count": {
                $sum: 1
            }
        }
    },
    {
        $sort: {
            "count": -1
        }
    },
    {
        $limit: 15
    }
 ])

注意:顺便说一下,请注意在您的独特示例中不需要 $and 运算符:您可以这样做

db.ped.distinct("DOB", {"Breeder":{$regex: /Smith/},"DOB-Year":2013}).length

因为 $and 在只使用逗号时是隐式的,只有在特殊情况下才需要它

编辑:

在您最后发表评论后,我意识到您需要分组两次:

第一次按饲养员和出生日期分组以查找窝,然后按饲养员对结果分组以查找窝数更多的窝。您的聚合应如下所示:

    db.ped.aggregate([
    {
    $match: {
        "DOB-Year": 2014
    }
    },
    {
    $group: {
        _id: {
            "Breeder": "$Breeder",
            "DOB": "$DOB"
        },
        "count": {
            $sum: 1
        }
    }
    },
    {
    $group: {
        _id: {
            "Breeder": "$_id.Breeder"
        },
        "count": {
            $sum: 1
        }
    }
    },
    {
    $sort: {
        "count": -1
    }
    },
    {
    $limit: 15
    }
]);

关于具有不同的 Mongodb 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259009/

相关文章:

node.js - 如何在终端重启mongodb?

javascript - Mongoose 查找多个文档

c# - MongoDB:规范化存储到嵌入式领域模型

mongodb - 文档数据库中的多对多

node.js - Node 事件.js :136 throw er; Unhandled 'error' event

MongoDB 在同一查询中推送到多个子文档

javascript - 如何使用 JayData 自定义 OData 服务器?

python - Python 中的 MongoDB 图形用户界面

MongoDB $match by 数组子集

MongoDB 按计数分组删除记录