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
'source' 카테고리의 다른 글
긴 포인터가 무엇입니까? (0) | 2023.07.08 |
---|---|
POST를 사용하여 Axios Excel 파일을 다운로드하면 파일이 손상됨 (0) | 2023.07.08 |
데이터 프레임을 추가하여 판다와 함께 사용할 수 있습니다. (0) | 2023.07.08 |
전체 입력 문자열을 변환하기 전에 Oracle 날짜 형식 그림이 종료됩니다. (0) | 2023.07.08 |
'gitrebase'를 사용하여 이전 커밋 메시지 변경 (0) | 2023.07.08 |