2012-06-25 7 views
6

도메인 정보가 들어있는 문서가있는 domain 컬렉션이 있습니다. 그 중 일부는 역사적인 whois 레코드입니다.이 레코드는 0 개 이상일 수 있으며 문서의 대부분의 공간을 차지합니다.MongoDB : 문서를 저장하면 전체 문서가 다시 작성됩니까?

전체 문서를로드하는 경우 작은 숫자 (숫자 필드 업데이트)를 변경하고 save() 메서드를 사용하면 전체 문서가 디스크에 플러시되거나 변경된 BSON 만 업데이트됩니까? 궁극적으로 내 질문은 내가 update()의 코드를 I/O를 절약하기 위해 복잡하게해야합니까 아니면 그냥 save()을 사용해야합니까?

이것은 순전히 게으름으로 인한 것이 아니며, 문서 전체를 읽은 후에 문서를 수정/처리하는 일련의 단계를 거치며 변경이 이루어지면 전체 문서가 저장됩니다. 그러나 문서를 저장하는 비용이 높으면 어쩌면 다른 방식으로 생각해야 할 것입니다 ...

답변

4

$set으로 문서의 단일 필드를 업데이트 할 수 있습니다. 그러면 디스크의 필드가 수정됩니다. 그러나 if the document grows beyond the size before the update, the document may have to be relocated on disk. 한편

, here is what the documentation says about save versus update :

>// x is some JSON style object 
>db.mycollection.save(x); // updates if exists; inserts if new 
> 
>// equivalent to: 
>db.mycollection.update({ _id: x._id }, x, /*upsert*/ true); 

참조

+0

도움이 되긴하지만 실제로 제 질문에는 답하지 않습니다. 10MB BSON 문서가 있다면, 한 속성을 변경하고 전체 10MB를 다시 쓰게 될 것입니다. 문서를 재배치 할 필요가 없다고 가정합니다. –

+0

MongoDB가 메모리 매핑 파일을 사용한다는 사실에 대한 자세한 설명은 * "쓰여진 전체 내용"입니다. 단일 속성 만 업데이트하면 이상적으로 해당 바이트 만 디스크로 플러시됩니다. 그러나 BSON이 충분히 바뀌면 디스크에 모든 것을 플러시 할 수 있습니다. –

+1

@GatesVP : 전체 페이지가 더럽다고 표시되어 플러시되어야한다고 생각했습니다. –

2

이것은 사용중인 클라이언트 라이브러리에 따라 다릅니다. 예를 들어 Mongoid (루비의 ODM)는 변경된 필드 만 전송할만큼 똑똑합니다 ($set 명령 사용). 때로는 너무 똑똑하고 중첩 된 해시에 대한 변경 사항을 인식하지 못합니다. 그러나 나는 그것이 변하지 않은 들판을 보내는 것을 본 적이 없다.

다른 라이브러리/드라이버는 다르게 동작 할 수 있습니다.

0

이 질문은 오래되었지만 데이터베이스 구조를 설계하는 데 어떻게 도움이되는지 알고 있으면 매우 유용합니다. 다음은 MongoDB의 스토리지 엔진에 대한 세부 사항입니다. https://docs.mongodb.com/v3.2/faq/storage/

문서에 대한 대답입니다. 기본적으로 MongoDB의 정수 필드를 업데이트하면 정수가있는 메모리의 페이지 (일반적으로 4k)를 더러워지며 다음 디스크가 플러시 될 때 메모리 페이지를 디스크에 씁니다. 따라서 문서 크기가 매우 큰 경우 문서의 일부만 디스크에 기록 할 수 있습니다.

그러나 다른 많은 경우가 있습니다. 문서에 더 많은 데이터를 채우는 경우 MongoDB가 전체 문서를 새로운 위치로 이동시켜 문서가 커질 수있는 기회가 있습니다. 이 경우 전체 문서가 디스크에 기록됩니다.

관련 문제