2015-08-27 165 views
1

对于Mongodb是全新的我已经搜索了一个答案,并没有找到一个这个问题。我如何将不同的选项添加到聚合查询中? 我有一个谱系数据库,我想找到在特定年份培育出最多窝的繁殖者。我有一个字段“DOB”,在其他查询我能找到多少窝在2013年由“史密斯”饲养用这样的:Mongodb聚合与不同

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 

很明显,我真正想从第一块代码应该说史密斯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 
} 
+0

请显示一个示例文档。 –

+0

我怀疑一些文件有一个不正确的“DOB年”。你可以执行'db.ped.find({“Breeder”:“Smith”,“DOB”:“09/15/2014”})'?你应该看到9个文件,你可以仔细检查它们吗? –

+0

好吧,我想在理解我遇到的问题,但仍然不知道正确的方法来找到我正在寻找的结果。我正在运行的'distinct'查询查找特定年份中特定育种者有多少个“DOB”实例。综合查询是在特定年份找到最多窝的育种者。我正在寻找'aggregate'结果中'distinct'的能力。有没有办法做到这一点?谢谢。 –

回答

1

既然你愿意组也DOB,你shuld它包括在你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 
    } 
]); 
+0

非常感谢您的回复。不幸的是,它还有一些不太正确的地方。我想我会发表一个回复来解释,因为我似乎受评论中的字符限制。 –