Агрегация SQL в Монго - PullRequest
0 голосов
/ 15 мая 2018

Привет! Я хочу изменить свой SQL-запрос на агрегацию Монго.

select c.year, c.minor_category, count(c.minor_category) from Crime as c 
group by c.year, c.minor_category having c.minor_category = (
    Select cc.minor_category from Crime as cc where cc.year=c.year group by
    cc.minor_category order by count(*) desc, cc.minor_category limit 1)

Я пытался сделать что-то вроде этого:

 db.crimes.aggregate({ 
$group: {
    "_id": {
        year: "$year", 
        minor_category :"$minor_category", 
        count: {$sum: "$minor_category"} 
     } 
   },
}, 
{
    $match : {
           minor_category: ?
    }
})

Но я застрял в $ match, что эквивалентно наличию, но я не знаю, как сделать подзапросы в монго, как в моем sql-запросе.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Это переводит в следующий запрос MongoDB:

db.crime.aggregate({
    $group: { // group by year and minor_catetory
        _id: {
            "year": "$year",
            "minor_category": "$minor_category"
        },
        "count": { $sum: 1 }, // count all documents per group,
    }
}, {
    $sort: {
        "count": -1, // sort descending by count
        "minor_category": 1 // and ascending by minor_category
    }
}, {
    $group: { // now we get the highst element per year
        _id: "$_id.year", // so group by year
        "minor_category": { $first: "$_id.minor_category" }, // and get the first (we've sorted the data) value
        "count": { $first: "$count" } // same here
    }
}, {
    $project: { // remove the _id field and add the others in the right order (if needed)
        "_id": 0,
        "year": "$_id",
        "minor_category": "$minor_category",
        "count": "$count"
    }
})
0 голосов
/ 15 мая 2018

Хорошо, на основании подтверждения выше, следующий запрос должен работать.

db.crime.aggregate
([
  {"$group":{"_id":{"year":"$year","minor":"$minor"},"count":{"$sum":1}}},
  {"$project":{"year":"$_id.year","count":"$count","minor":"$_id.minor","document":"$$ROOT"}},
  {"$sort":{"year":1,"count":-1}},
  {"$group":{"_id":{"year":"$year"},"orig":{"$first":"$document"}}},
  {"$project":{"_id":0,"year":"$orig._id.year","minor":"$orig._id.minor","count":"$orig.count"}}
)]
...