inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Từ những điều cơ bản về mongoDB đến công việc thực tế (feat. Node.js)

하나만 더 질문드릴게요!

Đã giải quyết

240

you

4 câu hỏi đã được viết

2

아까의 답변으로 한참 고생했던게 해결됬습니다.

제가 JS를 시작한지 얼마 안되서 사용법을 잘 모르겠는데 예를들어

let user = {};

user.id = 123; 을 입력하면

user = { id: 123} 이렇게 잘 나옵니다.

그리고 mongoose에서 user 문서 내부의 info Object안에 있는 id를 변경할 때에는

$set {"info.id" : ~~~} 이런식으로 변경하는걸로 알고있습니다.

그걸 updateBody 안에 모아서 한번에 쏴주고싶은데

어떤 식을 써야 updateBody = { "info.id": ~~ } 이같은 형식의 데이터가 만들어지는지 모르겠습니다.

제가 시도한 코드

let updateBody = {};

updateBody."info.id" = 123   -실패

 

updateBody.push({ "info.id": 123}) , updateBody.insert({ "info.id": 123}) 또한 실패했습니다.

rest-api nodejs mongodb javascript aws DBMS/RDBMS 데이터 엔지니어링

Câu trả lời 2

1

you

감사합니다ㅎㅎ 답변 달아주신거 보고 해결했습니다.

( 앱 모달창으로 한번에 하나의 item만 수정할 수 있습니다. )

export const ReviseCafeData = async (params: any) => {
try {
const { cafe_id, introduction, beans, phone } = params;
let updateBody: any = {};
if (introduction && !beans && !phone) updateBody = { 'cafe_info.introduction': introduction };
else if (!introduction && beans && !phone) updateBody = { 'cafe_info.beans': beans };
else if (!introduction && !beans && phone) updateBody = { 'cafe_info.phone': phone };
else console.log('데이터가 하나만 등록되어야 함'); // 배포 시 return err 처리
return await CafeModel.findOneAndUpdate({ cafe_id }, updateBody, { new: true });
} catch (err) {
console.log(err);
return { err };
}
};

0

sihoon

유성현님 안녕하세요 :)

아래처럼 여러 값들을 입력해주시면 하시면 됩니다. 그리고 $set은 생략하셔도 되요. 몽구스가 중간에 $set을 입력해줍니다.

const user = await User.findOneAndUpdate({ _id: userId }, { 'info.id': newId, 'info.name': newName })

그리고 'info.id'이렇게 표시한 이유는 Javascript에서 가능하지 않은 문법이기 때문이에요.

그래서 key를 텍스트로 해서 info 객체 안에 있는 id를 newId로 변환해달라는 의미에서 저렇게 표시해주는겁니다. 그러면 몽고디비에서 해당 키를 파싱 해서 올바르게 업데이트 처리를 해줍니다!

마찬가지로 전에 설명드렸던 $도 JS문법은 아니고 몽고디비가 파싱해서 사용합니다.

const user = await User.findOneAndUpdate(
{ _id: userId, 'friends._id': friendId },
{ 'info.id': newId, 'info.name': newName, 'friends.$.name': newFriendName },
{ new: true }
)

이렇게 업데이트를 하면 info 객체 안에 있는 id, name도 업데이트가 되고 friends 배열 안에 _id가 friendId인 객체의 name도 newFriendName으로 업데이트 해줍니다. 배열 안에 특정 객체를 업데이트할 때 $를 표시해주는건 배열에 포함되어 있는데 모든 객체가 아니라 특정 객체임을 표시해주기 위함이에요!

만약 'friends.name': newFriendName으로 하게 되면 해당 배열에 있는 모든 객체의 name들이 업데이트되게 됩니다!

 

그리고 updateBody를 따로 사용한 이유는 API 요청 조건에 따라 findOneAndUpdate에서 두번째 인자(업데이트 객체)가 바뀔 수 있기 때문이에요. 아래 두 코드는 완벽하게 동일한 코드입니다!

 

const user = await User.findOneAndUpdate(
{ _id: userId, 'friends._id': friendId },
{ 'info.id': newId, 'info.name': newName, 'friends.$.name': newFriendName },
{ new: true }
)

 

const updateBody = { 'info.id': newId, 'info.name': newName, 'friends.$.name': newFriendName }
const user = await User.findOneAndUpdate(
{ _id: userId, 'friends._id': friendId },
updateBody,
{ new: true }
)

option usecreateindex is not supported 오류 나면은

0

147

1

Schemaless 특성을 재생시 검은화면이 나와요

0

241

1

user 내장 시 ref 필드 필요성

0

240

1

await 관련해서 질문드릴게 있습니다!!

0

293

2

섹션6의 3번째 강의 faker파일이 어디있나요?

0

310

1

$elemMatch 질문이 있습니다.

0

248

1

DB 업데이트에 실패했을 상황에서 대처는 어떻게 할 수 있나요.

2

767

2

블로그에 user 데이터를 추가하는 방법에 대해서

0

238

1

blog 데이터 생성시 user 관련 오류

0

352

1

age 예외 처리를 별도로 하신 이유가 궁금합니다.

2

302

2

delete 메소드가 많은 이유가 궁금합니다.

0

182

1

unique validation 처리

0

297

1

updateMany에서 user._id를 못찾는 상황

1

397

1

find() 가 리턴하는 instance member

1

432

3

몽고 db를 백업방법을 부탁합니다.

0

604

1

인덱스 생성시점

0

713

1

$pull 문법에 대한 질문

0

361

1

comment의 id가 생성되는 시점

1

303

1

리팩토링 강의에서 라우터 리팩토링 전개연산자(...)

1

316

1

session.abortTransaction()에 대한 실제 예시 문의

0

289

1

섹션9 Computed Fields 강의에서, 다음 강의 가기 전 빠진부분

-1

411

1

faker 패키지 취약성 이슈

1

488

1

라우터 리팩토링

0

345

1

섹션4 진행중, mongoose 질문

0

312

1