mongo aggregation example
작성중…
mongodb query example
verion 5.5 기준
update
db.collection.update(
{ site_id: "xxx" },
[{ $set: {
"title.de": { $cond: [ { $not: ["$title.de"] }, "", "$title.de" ] },
"content.ru": { $cond: [ { $not: ["$content.ru"] }, "", "$content.ru" ] }
}}],
{ multi: true }
)
기존의 값을 이용해서 값을 update 할 때:
db.getCollection('Album').find().snapshot().forEach(
function (e) {
for(var i=0; i<e.photos.length; i++) {
e.photos[i].webPath = '/uploads'+e.photos[i].webPath;
}
db.getCollection('Album').save(e);
}
)
//
db.collection.updateMany(
{ myid: {$exists: false}, [{ $set : {myid: "$_id"} }]
)
특정 array field 에서 값 삭제
// item collection
{ item_list: ["item1", "item2", "item3"]},
{ item_list: ["item1", "item5", "item6"]}
// item_list 에 'item1' 이 있는 모든 doc 의 item_list 에서 'item1' 을 제거
db.item.updateMany(
{
item_list: "item1"
},
{ $pull : {
item_list: "item1"
}}
)
aggregation lookup
rdbms 의 join 과 비슷. 다음은 session doc 에 event doc 을 join 하는 것(session id 를 키로 해서 join)
db.session.aggregate([
{"$match":
{"time_a": {
"$gte" : ISODate("2022-07-21T00:30:00Z"),
"$lt" : ISODate("2022-07-21T00:40:00Z")
}},
},
{"$lookup":{
"from": "event",
"let": { "param_id": "$_id"},
"pipeline": [
{ "$match":
"type": 1,
// join on 조건은 expr 로 해야만 동작한다.
// "$si_of_event": $$param_id 는 동작하지 않는다
{ "$expr":
{ "$and": [
{ "$eq": [ "$si_of_event", "$$param_id" ] },
]}
}
},
{ $project: {
_id: 0, type: 1
}}
],
"as":"event_info"
}},
])
특정 field 값이 같은 doc 끼리 특정 값을 비교해서 순위를 매기는 방법
$rank
는 1,2,2,4 로 표시 되고, $denseRank
는 1,2,2,3 으로 표시된다.
state field 의 값이 같은 것끼리 순위를 매긴다. quantity 값으로 정렬
db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { quantity: -1 },
output: {
denseRankQuantityForState: {
$denseRank: {}
}
}
}
}
] )
array size 가 1 보다 큰 것에 대한 $match
size 가 1인 경우:
db.inventory.find({tags:{$size:1}})
size 가 1보다 큰 경우:
db.invantory.find({
$expr: {
$gt: [{ $size: { $ifNull: ["$tags", []] } }, 0]
}
})
// 아래는 틀린 query 이다.
db.invantory.find({
tags: {
$gt: [{$size: "$tags"}, 0]
}
})
댓글 없음:
댓글 쓰기