반응형

어리석게도

Map을 써야하는 때에도 계속해서 

객체를 써온것 같다.

 

기초를 다시 다지기위해

오래전 봤던 책을 다시 보는 과정에서

깨달은 바를 기록한다.

 

Map은 객체와 유사하고

Set은 배열과 유사하다.

 

Map

객체는 활용도가 높고 상당히 자유도가 부여되지만

그에따라 아래와 같은 문제가 있다.

1. 프로토타입 체인 때문에 의도치 않은 연결이 발생할 수 있다.

2. 객체 안에 연결된 키와 값이 몇개나 되는지 쉽게 알아낼 수 없다.

// 객체 예제
const object1 = {
  "height": 100,
  "width": 200
};

// 객체 크기
Object.keys(object1).length;

// Map 예제
const map1 = new Map();
map1
  .set("height", 100)
  .set("width", 200);
  
// Map 크기
map1.size;

3. 키는 반드시 문자열이나 심볼이어야 하므로 객체를 키로 써서 값과 연결할 수 없다.

// 객체
const object2 = {
  "user": "USER",
  "admin": "ADMIN"
};

// Map
const map2 = new Map();
map2
  .set("user", "USER")
  .set("admin", "ADMIN");
  
const guest = "unknown_001";
map2.set(guest, "GUEST");

4. 객체는 프로퍼티 순서를 전혀 보장하지 않습니다.

 

 

Set

Set은 배열과 유사하지만

중복을 허용하지 않는 데이터의 집합이라는

큰 장점이 있다.

 

다르게 말하면 Set에서는

중복 검사 자체가 필요없다는 뜻이다.

Set에서 중복 데이터를 add하면

해당 액션은 무시된다. (아무일도 일어나지 않음)

 

const users = new Set();
users
  .add("jaeky")
  .add("julia");

users.delete("jaeky");
users.size;
반응형
반응형

NoSQL을 다루다보면 제목과 같은 일이 제법 빈번히 발생한다.

const ProductSchmea = new mongoose.Schema({
  ...
  comments: [
  	{
      userId: ...,
      comment: ...,
      createdAt: ...,
      updatedAt: ...,
    }
  ]
});

 

위와 같은 설계를 하는일이 제법 많기때문이다.

상품에 대한 댓글을 위처럼 관리하면 매우 쉽기 때문이다.

그런데 comments를 수정하려면 어떻게 할까...? 가 문제다.

 

먼저, comments를 추가하는것은 제법 간단하다.

...
try {
  const commentInfo = {
    userId: ...,
    comment: ...,
  };
  
  await Prodcut.findOneAndUpdate({ _id: id }, { $push: { comments: commentInfo } }).exec();
} catch(error) {
  ...
}
...

이런식으로 push해서 넣으면 끝..!

 

대망의 수정이다.

알고나면, ? 쉽네 뭐야 어떻게 된거지? 라고 할만큼 쉽다.

하지만, 모르면 도저히 그 방법을 찾을수가없다.

 

...

try {
  await Product.findOneAndUpdate(
    { _id: id, 'comments._id': commentId }, 
    { $set: { 'comments.$.comment': '수정해버림' } 
  }).exec();
  
} catch(error) {
  ...
}

...

포인트는 두가지이다.

1. comment._id를 알아야한다는 것.

2. comments.$.comment

여기서 .$은 javascript의 [n]을 대신해준다.

 

위의 정보는 은근히 찾기 어려워 이렇게 간단히 주석을 남긴다.

반응형

'개발, 코딩 > RDB|SQL|NoSQL' 카테고리의 다른 글

Mongo, $project에서 array타입 null체크하여 처리하기  (0) 2020.04.21
$text - mongo  (0) 2020.04.07
react-native, webview 마스터  (0) 2019.11.19
mongodb, 배열처리하기  (0) 2019.11.19
AWS, s3 이미지 업로드  (0) 2019.11.19