학습 MongoDB -- (3 - 3): 문서 업데이트 (종료 편)
[수정 기 속도]
수정 기 "$inc"는 현지에서 문 서 를 수정 할 수 있 으 며 문서 크기 의 변 화 를 일 으 키 지 않 기 때문에 작업 이 빠 릅 니 다.배열 형식의 수정 기 는 작업 후 문서 크기 의 변 화 를 일 으 킬 수 있 기 때문에 느 릴 수 있 습 니 다.수정 기 '$set' 작업 이 문서 크기 변 화 를 일 으 키 면 속도 가 느 리 고 그렇지 않 으 면 작업 이 빠 릅 니 다.MongoDB 는 문서 에 공간 을 할당 할 때 문서 크기 의 변화 에 적응 하기 위해 일정한 보 정 을 남 깁 니 다.그러나 문서 의 변화 가 너무 크 면 이 보 백 공간 이 부족 하면 문서 공간의 재 분 배 를 초래 하여 작업 속 도 를 늦 출 수 있다.
앞으로 의 응용 에서 '$push' 와 같은 배열 수정 기 가 문서 업데이트 의 병목 이 되 는 것 을 발견 하면 내장 배열 을 꺼 내 독립 적 인 집합 으로 존재 하 는 것 을 고려 해 야 합 니 다!
【upsert】
upsert 는 특별한 업데이트 입 니 다. 문서 가 업데이트 조건 에 부합 되 지 않 으 면 이 조건 과 문 서 를 바탕 으로 새로운 문 서 를 만 듭 니 다. 이 조건 에 따라 문 서 를 찾 을 수 있다 면 업데이트 작업 을 수행 합 니 다.update 와 insert 작업 을 집합 한 집합체 입 니 다.upsert 의 조작 은 원자 적 이다.업데이트 할 때 upsert 를 사용 하 는 방법 을 알 아 보 겠 습 니 다.
> db.math.remove();
> db.math.find();
> db.math.update({"count":25},{"$inc":{"count":15}}, true);
> db.math.find();
{ "_id" : ObjectId("501fb4bb04fe6019ab47da1f"), "count" : 40 }
>
우 리 는 먼저 집합 한 reove () 방법 으로 집합 한 모든 문 서 를 비우 고 update 방법 을 호출 합 니 다. 여기 서 update 방법의 세 번 째 인 자 를 사 용 했 습 니 다. 우 리 는 true 를 전 달 했 습 니 다. 이 true 는 이 update 작업 시 upsert 작업 을 나타 냅 니 다.원래 집합 에 문서 가 없 었 습 니 다. 우 리 는 count = 25 의 문 서 를 삽입 하 는 동시에 그 값 을 15 증가 시 켰 습 니 다. 그래서 실행 이 끝 난 후에 집합 에 문서 가 하나 있 습 니 다. count = 40.
[save 함수 사용]
save 는 집합 함수 입 니 다. 매개 변수 만 있 고 문서 입 니 다.이 문서 에 ' id' 키 가 포함 되 어 있 으 면 save 는 upsert 로 전 환 됩 니 다. 문서 에 ' id' 키 가 존재 하지 않 으 면 save 함 수 는 기본적으로 집합 에 문 서 를 삽입 합 니 다.
> db.math.remove();
> db.math.find();
> db.math.save({"count":10});
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 10 }
> db.math.save({"count":10});
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 10 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 10 }
> var x = db.math.findOne({"_id":ObjectId("501fb5b5e64fb552a4f6651f")});
> x.count = 20;
20
> db.math.save(x);
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 20 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 10 }
>
[여러 문서 업데이트]
현재 제 가 사용 하고 있 는 MongoDB 2.0.6 업데이트 작업 은 업데이트 작업 의 조회 조건 에 맞 는 문서 가 여러 개 있 으 면 첫 번 째 일치 하 는 문서 만 업데이트 하 는 것 입 니 다.한 번 에 여러 문 서 를 업데이트 하려 면 update 함수 의 네 번 째 인 자 를 사용 하여 true 를 전달 하려 면 모든 업데이트 입 니 다. 그렇지 않 으 면 첫 번 째 항목 만 업데이트 합 니 다.
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 10 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 10 }
> var y = db.math.findOne({"_id":ObjectId("501fb5b5e64fb552a4f6651f")});
> db.math.update({"count":10},
... {"$inc":{"count":10}});
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 20 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 10 }
> y.count = 10;
10
> db.math.save(y);
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 10 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 10 }
> db.math.update({"count":10},
... {"$inc":{"count":10}}, false, true);
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 20 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 20 }
>
위의 코드 는 update 의 네 번 째 인 자 를 비교 하여 보 여 주 며 true 를 전달 하면 모든 일치 하 는 문 서 를 업데이트 합 니 다.MongoDB Shell 에서 모든 명령 을 실행 하면 getLastError 명령 을 실행 하여 지난번 에 실 행 된 명령 이 몇 개의 문서 에 영향 을 미 쳤 는 지 볼 수 있 습 니 다.
> db.math.find();
{ "_id" : ObjectId("501fb5b5e64fb552a4f6651f"), "count" : 40 }
{ "_id" : ObjectId("501fb5cae64fb552a4f66520"), "count" : 40 }
> db.math.update({"count":40},
... {"$inc":{"count":10}}, false, true);
> db.runCommand({"getLastError" : 1});
{
"updatedExisting" : true,
"n" : 2,
"connectionId" : 1,
"err" : null,
"ok" : 1
}
>
데이터베이스 에서 runCommand ({getLastError: 1}) 를 호출 하면 문 서 를 되 돌려 줍 니 다. 이 문서 에서 '키' n 의 값 은 마지막 작업 에 영향 을 준 문서 항목 입 니 다.
[업 데 이 트 된 문 서 를 되 돌려 줍 니 다]
db. runCommand ({getLastError: 1}) 를 통 해 마지막 작업 에 영향 을 미 친 문서 의 수 를 되 돌려 줄 수 있 지만 업 데 이 트 된 문 서 를 되 돌려 주지 않 습 니 다.find AndModify 명령 을 통 해 이 정 도 는 할 수 있 습 니 다.이 명령 은 일반적인 업데이트 작업 과 달리 조금 느 립 니 다. 데이터베이스 가 응답 한 후에 돌아 와 야 하기 때 문 입 니 다. 다른 업데이트 작업 은 모두 순간 에 완 료 됩 니 다. (이 뒤에 언급 될 것 입 니 다)우 리 는 이러한 예 를 보 여 줍 니 다. 우 리 는 실행 스 레 드 의 집합 (processes) 이 있 습 니 다. 그 중에서 스 레 드 의 상태 와 우선 순위 정보 가 있 습 니 다. 우 리 는 상태 가 준비 되 어 있 고 ("READY") 우선 순위 의 마지막 스 레 드 를 찾 아서 실행 상태 로 업데이트 하고 더 새로운 문서 로 돌아 가 야 합 니 다.
> db.processes.find();
{ "_id" : ObjectId("501fc059e64fb552a4f66521"), "status" : "READY", "priority" :
1 }
{ "_id" : ObjectId("501fc073e64fb552a4f66522"), "status" : "READY", "priority" :
2 }
{ "_id" : ObjectId("501fc07ae64fb552a4f66523"), "status" : "READY", "priority" :
3 }
{ "_id" : ObjectId("501fc07de64fb552a4f66524"), "status" : "READY", "priority" :
4 }
> db.runCommand({"findAndModify":"processes",
... "query":{"status":"READY"},
... "sort":{"priority":-1},
... "update":{"$set":{"status":"RUNNING"}},
... "new":true});
{
"lastErrorObject" : {
"updatedExisting" : true,
"n" : 1,
"connectionId" : 1,
"err" : null,
"ok" : 1
},
"value" : {
"_id" : ObjectId("501fc07de64fb552a4f66524"),
"priority" : 4,
"status" : "RUNNING"
},
"ok" : 1
}
findAndModify 명령 을 실행 하면 문서 로 돌아 갑 니 다. 그 중 하 나 는 "value"입 니 다. 그 값 은 내장 문서 입 니 다. 바로 업 데 이 트 된 문서 입 니 다.방금 명령 을 실 행 했 을 때 Shell 에 있 는 문서 의 키 는 문자열 일 것 입 니 다. 따옴표 를 넣 지 않 아 도 되 지만 추가 하 는 것 을 권장 합 니 다. 여기 서 추가 하 는 것 을 추천 합 니 다.이어서 이 find AndModify 명령 을 말씀 드 리 겠 습 니 다. 그 중에서 다음 과 같은 키 와 관련 된 의 미 는 다음 과 같 습 니 다.
1. findAndModify: 집합 명.
2. query: 문 서 를 조회 합 니 다. 이 명령 의 역할 을 하 는 문 서 를 찾 습 니 다.
3. sort: 이 명령 은 한 문서 에 만 적 용 됩 니 다. 여러 항목 이 일치 하면 이 정렬 을 누 르 고 첫 번 째 항목 을 가 져 와 업데이트 합 니 다.우 리 는 위의 예 에서 볼 때 정렬 도 하나의 문서 {"priority": - 1} 을 받 아들 입 니 다. 값 이 마이너스 라면 거꾸로 서술 하고 값 이 플러스 라면 정렬 합 니 다.4. update: 수정 기 문서, 일치 하 는 문서 에 대한 작업 입 니 다.
5. reove: 불 형식 은 일치 하 는 문 서 를 삭제 하 는 지 여 부 를 표시 합 니 다. reove 와 update 도 하나만 존재 해 야 합 니 다.
6. new: 불 형식 입 니 다. 되 돌아 오 는 문서 에서 "value"가 가리 키 는 내장 문 서 는 위 와 일치 하 는 문서 가 수정 되 었 습 니까? 수정 되 었 습 니까?true 라면 수 정 된 것 입 니 다. 그렇지 않 으 면 수 정 된 것 이지 만 일치 하 는 문서 도 수 정 된 것 입 니 다.
findAndModify 이 명령 은 한 번 에 하나의 문서 만 업데이트 할 수 있 도록 제한 되 어 있 습 니 다.또한 업데이트 나 삭제 작업 만 수행 할 수 있 습 니 다.이 명령 을 실행 합 니 다. 문서 에 일치 하지 않 으 면 업데이트 작업 을 수행 하지 않 습 니 다. 되 돌아 오 는 문서 의 'value' 값 은 null 입 니 다.
[순간 완성!]
우리 가 현재 보고 있 는 각종 데이터 베이스 작업: 삽입, 삭제, 업데이트 (방금 findAndModify 명령 제외) 는 모두 순간 에 완 성 된 것 입 니 다. 클 라 이언 트 가 명령 을 보 낸 후에 즉시 돌아 가 는 것 입 니 다. 데이터 베 이 스 를 기다 리 지 않 고 어떠한 조작 결과 나 이상 을 던 지 는 것 입 니 다.우 리 는 이런 조작 을 '시 위 를 떠 난 화살' 이 라 고 부른다.이런 방식 의 가장 큰 장점 은 바로 빠르다 는 것 이다!데이터 의 완전 성에 대한 요구 가 높 지 않 은 빅 데이터 양 조작, 예 를 들 어 대량의 로그 기록 등 을 처리 하 는 것 이 특히 적합 하 다.그러나 주문 시스템 과 같은 안전 에 대한 요구 가 높 은 데이터 베이스 작업 에 대해 우 리 는 시 위 를 벗 어 나 는 화살 에 의존 할 수 없습니다. 우 리 는 데이터 베 이 스 를 조작 한 후에 'getLastError' 명령 을 실행 해 야 합 니 다. 방금 조작 한 결과 에 성공 여 부 를 포함 하고 실패 하면 이상 한 원인 도 포함 되 어 있 습 니 다.
이런 안전 조작의 결 과 는 바로 성능 의 손실 이다. 조작 후 우 리 는 반드시 데이터베이스 의 응답 을 기 다 려 야 한다.실제 응용 에서 데이터 가 중요 하 다 면 안전 방식 을 사용 하 라. 그렇지 않 으 면 과감하게 '시 위 를 떠 난 화살' 을 사용 하 라!
[요청 과 연결]
MongoDB 는 모든 데이터베이스 연결 을 위 한 요청 대기 열 을 만 듭 니 다. 클 라 이언 트 가 보 낸 요청 은 이 대기 열 에 먼저 놓 습 니 다. ('시 위 를 벗어난 화살' 에 대한 요청 은 바로 돌아 갑 니 다) MongoDB 는 대기 열 에서 하나씩 요청 을 꺼 내 집 니 다.같은 연결 에 대해 앞에서 요청 한 작업 결 과 는 뒤에 요청 한 것 을 볼 수 있 습 니 다.
MongoDB 문서 업 데 이 트 는 여기까지 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
cat more less 등 명령 의 차이 와 사용cat 는 텍스트 파일 보기 와 연결 도구 입 니 다.파일 의 내용 을 보 려 면 cat 를 사용 하 는 것 이 간단 합 니 다. cat 에 인자 - n 과 nl 도구 의 차이 가 많 지 않 고 파일 내용 을 출력 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.