Nice programing

MongoDb : $ push / $ addtoset의 차이점

nicepro 2020. 11. 20. 09:37
반응형

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

반응형