MongoDb : $ push / $ addtoset의 차이점
나는 MongoDb의 문서를 읽었고 간단한 증명을 사용했고 나는 단지 그것을 본다 : Push는 배열을 정렬하지만 addtoSet
그렇지 않다.
나에게는 시각적으로 동일하지만 차이점을 모르겠습니다.
아무도 나에게 차이점을 설명해 주시겠습니까?
또 다른 생각은 그것이 스페인어 나 간단한 영어 일 수 있다면, 나는 그것을 우선시 할 것입니다.
$addToSet
항목이 이미 포함되어있는 경우 주어진 필드에 항목을 추가하지 마십시오. 반면에 항목 $push
이 있는지 여부에 관계없이 지정된 개체를 필드에 추가합니다.
{_id: "docId", items: [1, 2]}
db.items.update({_id:"docId"}, {$addToSet:{items: 2}}); // This won't update the document as it already contains 2
db.items.update({_id:"docId"}, {$push: {item:2}}); // this will update the document. new document {_id: "docId", items:[1,2,2]}
$ push- 받은 순서대로 항목을 추가합니다. 또한 동일한 항목을 여러 번 추가 할 수 있습니다.
$ addToSet- 고유 한 항목 만 추가하지만 항목의 순서는 보장되지 않습니다.
순서대로 고유 항목을 추가해야하는 경우 $ addToSet을 통해 요소를 그룹화하고 추가 한 다음 요소로 배열을 $ unwind하고 항목별로 $ sort 한 다음 $ push 항목으로 다시 $ group을 수행 할 수 있습니다.
$ addToSet 및 $ push는 동일한 작업을 수행하지만 $ push는 중복을 유발하는 중복을 무시하고 모든 항목을 푸시합니다. 전자는 중복되지 않고 고유 한 항목 만 푸시합니다.
이름에서 알 수 있듯이 $ addToSet (set)는 중복을 허용하지 않지만 $ push는 단순히 요소를 배열에 추가합니다.
다른 사람들이 언급 한 차이점과 함께
$push
: 객체를 배열에 추가합니다.$addToSet
: 존재하지 않는 경우 배열에 객체를 추가합니다.
복제에 차이가 있습니다. (을 보면 알 수 있습니다 local.oplog.rs
)
$push
실제로 배열을 수정 한 작업은 다음과 같이 복제됩니다.$set.items.INDEX: item
$addToSet
실제로 배열을 수정 한 작업은 다음과 같이 복제됩니다.$set.items: [THE_ENTIRE_ARRAY]
큰 배열을 다루는 경우 차이가 클 수 있습니다.
그래서 (고유 한 배열을 유지하는 일반적인 사용 사례)
db.items.updateOne(
{_id: 'my-id', 'items': {'$ne': 'items1'},
{'$push': {
'items': 'item1',
}}
)
db.items.updateOne(
{_id: 'my-id'},
{'$addToSet': {
'items': 'item1',
}}
)
동일한 결과 문서로 끝날 수 있으며 복제 된 작업에 차이가 있습니다.
$ push : 결과 문서의 배열에 값을 삽입합니다. 예 :
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$ addToSet : 결과 문서의 배열에 값을 삽입하지만 중복을 만들지는 않습니다. 예 :
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
참고 URL : https://stackoverflow.com/questions/27248556/mongodb-difference-between-push-addtoset
'Nice programing' 카테고리의 다른 글
RuntimeWarning : 나누기에서 잘못된 값이 발견되었습니다. (0) | 2020.11.20 |
---|---|
문자열에 배열의 값이 포함되어 있는지 확인 (0) | 2020.11.20 |
환경 이름 (IHostingEnvironment.EnvironmentName)을 설정하는 방법은 무엇입니까? (0) | 2020.11.20 |
네임 스페이스가있는 XPath 선택 노드 (0) | 2020.11.20 |
클래스 매핑 오류 : 'T'는 매개 변수가없는 공용 생성자가있는 비추 상 유형이어야합니다. (0) | 2020.11.20 |