MongoDB Aggregate with Pymongo 관련
2020. 2. 28. 00:04ㆍ서버 프로그래밍
전체 기사에서 24시간 이내에 생성된 기사들에 대해서 카테고리별 개수를 구해서 출력하는 쿼리문
db.articles.aggregate(
{
$project:{
date:{
$dateFromString:{
dateString:'$created_at',
format:'%Y-%m-%d %H:%M:%S'
}
},
category:1
}
},
{
$match:{
date:{
$gte:new Date(new Date().getTime()-(1000*60*60*24))
}
}
},
{
$group:{
_id:{
category: '$category'
},
total:{
$sum:1
}
}
},
{
$sort:{
total:-1
}
}
)
문자열로 저장되어 있는 날짜를 날짜 타입으로 바꾸는 방법
{ $dateFromString: {
dateString: <dateStringExpression>,
format: <formatStringExpression>,
timezone: <tzExpression>,
onError: <onErrorExpression>,
onNull: <onNullExpression>
} }
https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromString/
현재 날짜를 기준으로 검색 쿼리를 사용하는 방법
db.collectionName.aggregate({
"$project": {
"year": {
"$year": "$date"
},
"month": {
"$month": "$date"
},
"day": {
"$dayOfMonth": "$date"
}
}
}, {
"$match": {
"year": new Date().getFullYear(),
"month": new Date().getMonth() + 1, //because January starts with 0
"day": new Date().getDate()
}
})
https://stackoverflow.com/questions/30772285/mongodb-find-query-comparision-with-currentdate
MongoDB 콘솔에서 Javascript의 Date 타입으로 날짜 연산을 한다
//24시간 전
new Date(new Date().getTime() - (1000*60*60*24))
https://heeestorys.tistory.com/744
pymongo로 연동시 datetime과 timedelta를 이용하여 날짜 연산을 수행할 수 있다.
# convert your date string to datetime object
start = datetime(2014, 9, 24, 7, 51, 04)
end = datetime(2014, 9, 24, 7, 52, 04)
inoshare.find( {'id_no': 1, 'datahora': {'$lt': end, '$gte': start}, 'porta': 'A0'})
<pymongo.cursor.Cursor at 0x7f9aafd64a90>
inoshare.find_one( {'id_no': 1, 'datahora': {'$lt': end, '$gte': start}, 'porta': 'A0'})
{u'_id': ObjectId('5435be9ce7b9916e02ed2cb5'),
u'datahora': datetime.datetime(2014, 9, 24, 7, 51, 5),
u'id_no': 1.0,
u'lab': u'2',
u'porta': u'A0',
u'sensor': u'1',
u'valor': u'917'}
https://stackoverflow.com/questions/26366417/how-to-make-a-query-date-in-mongodb-using-pymongo
* Aggregate를 이용하여 조건에 맞는 데이터를 추출해서 삭제하는 방법
db.grades.aggregate( [
{
$match:{type:'homework'}
},
{ $group:
{ _id: {student_id:"$student_id",type:'$type'},
score: { $max: "$score" }
}
}
]).forEach(function(doc){
db.grades.remove({'student_id':doc._id.student_id,'score':doc.score})
})