2015-08-27 263 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

非常感謝您的回覆。不幸的是,它還有一些不太正確的地方。我想我會發表一個回覆來解釋,因爲我似乎受評論中的字符限制。 –