[컴][db] mongodb query example

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]
    }
})

See Also

  1. 쿠…sal: [컴][웹][DB] MongoDB aggregation 예제 - max 일 때 index 얻어오는 방법
  2. Query for Documents With Array Size Greater Than 1 in MongoDB | Delft Stack

댓글 없음:

댓글 쓰기