source

Mongodb 그룹 및 정렬

nicesource 2023. 7. 8. 10:59
반응형

Mongodb 그룹 및 정렬

다음을 어떻게 번역할 수 있습니까?Sql을 묻다.Mongo?:

select a,b,sum(c) csum from coll where active=1 group by a,b order by a

Mongo와 함께 그룹을 실행하고 쿼리를 정렬할 수 있는 방법이 있습니까?

mongo의 웹사이트에 있는 이 예시에서 영감을 받았습니다.

더미 데이터 생성:

> db.stack.insert({a:1,b:1,c:1,active:1})
> db.stack.insert({a:1,b:1,c:2,active:0})
> db.stack.insert({a:1,b:2,c:3,active:1})
> db.stack.insert({a:1,b:2,c:2,active:0})
> db.stack.insert({a:2,b:1,c:3,active:1})
> db.stack.insert({a:2,b:1,c:10,active:1})
> db.stack.insert({a:2,b:2,c:10,active:0})
> db.stack.insert({a:2,b:2,c:5,active:1})

MONGO 쿼리:

> db.stack.aggregate(
... {$match:{active:1}},
... {$group:{_id:{a:"$a", b:"$b"}, csum:{$sum:"$c"}}},
... {$sort:{"_id.a":1}})

결과:

{"result" : [
    {"_id" : {"a" : 1,"b" : 2},"csum" : 3},
    {"_id" : {"a" : 1,"b" : 1},"csum" : 1},
    {"_id" : {"a" : 2,"b" : 2},"csum" : 5},
    {"_id" : {"a" : 2,"b" : 1},"csum" : 13}
],"ok" : 1}

(참고: 좀 더 읽기 쉽게 셸 결과를 다시 포맷했습니다.)

Aggregate 프레임워크를 사용하여 다음 작업을 수행할 수 있습니다.

db.coll.aggregate({ 
    $group: { 
        _id: "$a", 
        countA: { $sum: 1}, 
        sumC:{ $sum: "$c"}, 
    },
    $sort:{a:1}
});

그러나 데이터가 너무 많으면 다음 오류 메시지가 표시될 수 있습니다.

{
    "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
    "code" : 16389,
    "ok" : 0
}

SQL에서 Mongo로의 변환에 대한 자세한 내용은 여기를 참조하십시오. http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/

mongodb 집계 API가 변경된 것 같습니다.이제 당신은 할 것입니다.

db.coll.aggregate([
  {
     $group: { 
        _id: "$a", 
        countA: { $sum: 1}, 
        sumC:{ $sum: "$c"}, 
     }
  },
  {
    $sort:{a:1}
  }
])

aggregate()할 인수의 Array 구문을 확인합니다.$match, $limit 등의 링크를 이 배열의 요소로 추가할 수도 있습니다.

히스토그램을 작성했는데 버전 2.2.2에서 수행한 작업은 다음과 같습니다.

answer = db.coll.group(...)
db.histo.insert(answer)
db.histo.find().sort({ field: 1 })

이 시점에서, 만약 당신이 그것이 필요하지 않다면, 그냥.db.histo.drop().

변수를 피하고 다음 작업을 수행할 수도 있습니다.

db.histo.insert(db.coll.group(...))
db.histo.ensureIndex({ field: 1 })

$group과 $sort의 합계를 $group > $sort 순서로 사용할 수 있습니다. 그룹 앞에 정렬을 사용하면 작동하지 않습니다.아래의 예를 고려해 보십시오.

let data = await ABCModel.aggregate([
      {
        $match: { city: { $nin: ['', null] }},
      },
      {
        $group: {
          _id: { $toLower: '$city' }
        },
      },
      { $sort: { _id: 1 } },
    ]);
db.coll.group(
       {key: { a:true, b:true },
        cond: { active:1 },
        reduce: function(obj,prev) { prev.csum += obj.c; },
        initial: { csum: 0 }
        });

MongoDB에서 실행할 수 있습니다.

이전 답변에 추가하여 실제 열이 아닌 합계(집계 결과)를 기준으로 정렬하려면 다음 작업을 수행할 수 있습니다.

db.your_collection.aggregate([
    {
        $group: {_id: "$your_document_name", count: {$sum: 1}}
    }, 
    {
        $sort: {"count":-1}
    }
])

이는 다음 표준 SQL-ish 구문과 동일합니다.

select col_a, count(col_a) as b
from table
group by col_a
order by b desc

MongoDB 2.1에서 Aggregation Framework가 릴리스되기 전까지는 DB의 JavaScript 부분을 사용하기 때문에 이 답변과 같은 그룹에 대한 요청이 다소 느립니다.

그룹을 계산하는 데 빠른 방법을 사용할 수 있습니다.

var res = [];
for( var cur_a = db.coll.distinct('a'); cur_a.hasNext(); ) {
  var a = cur_a.next();
  for( var cur_b = db.coll.distinct('b'); cur_b.hasNext(); ) {
    var b = cur_b.next();
    res.push({ 'a': a, 'b' : b 'count': db.coll.count({'a':a,'b':b})}
  }
}

a와 b에 인덱스가 있으면 더 빠를 것입니다.

db.coll.ensureIndex({'a':1,'b':1})

다음 쿼리를 추가하고자 하는데, 예를 들어 두 개의 그룹화 시 유용할 수 있습니다.

쿼리:

db.getCollection('orders').aggregate([
    {$match:{
        tipo: {$regex:"[A-Z]+"}
        }
    },
    {$group:
        { 
            _id:{
                codigo:"1",
                fechaAlta:{$substr:["$fechaAlta",0,10]},
            },
            total:{$sum:1}
        }
    },
    {$sort:
        {"_id":1}
    },
    {$group:
        {
            _id:"$_id.codigo",
            fechasAltas:
            {
                $push:
                {
                    fechaAlta:"$_id.fechaAlta",
                    total:"$total"
                }
            },
            totalGeneral:{$sum:"$total"}
        }
    }
]); 

응답:

{
"_id" : "1",
"fechasAltas" : [ 
    {
        "fechaAlta" : "1940-01-01",
        "total" : 13.0
    }, 
    {
        "fechaAlta" : "2007-05-14",
        "total" : 115.0
    }, 
    {
        "fechaAlta" : "2008-09-30",
        "total" : 58.0
    }, 

    .
    .
    .
],
"totalGeneral" : 50620.0
}       

언급URL : https://stackoverflow.com/questions/6547441/mongodb-group-and-sort

반응형