Mongo DB에서 저장과 삽입의 차이점은 무엇입니까?


답변:


146

Vs 삽입 저장 :

주어진 예에서, 행동은 본질적으로 동일합니다.

save "_id"매개 변수와 함께 전달되면 다르게 작동합니다.

저장을 위해 문서에가 포함되어 있으면 필드 _id에서 컬렉션에 대한 쿼리를 업스 퍼링하고 _id, 그렇지 않은 경우 삽입합니다.

지정된 _id 값을 가진 문서가 없으면 save () 메소드는 문서의 지정된 필드를 사용하여 삽입을 수행합니다.

지정된 _id 값을 가진 문서가 있으면 save () 메서드가 업데이트를 수행하여 기존 레코드의 모든 필드를 문서의 필드로 바꿉니다.


저장 대 업데이트 :

update쿼리 매개 변수와 일치하는 기존 문서를 수정합니다. 일치하는 문서가 없으면 바로 그 시점 upsert입니다.

  • upsert : false : 해당 문서가 없으면 아무 일도 일어나지 않습니다
  • upsert : true : 쿼리 매개 변수 및 업데이트 매개 변수와 동일한 내용으로 새 문서가 작성됩니다.

save: 검색어 매개 변수를 허용하지 않습니다. _id존재하고 동일한 문서와 일치하는 문서가 있으면 이를 _id대체합니다. _id가 지정되지 않거나 일치하는 문서가 없으면 문서를 새 문서로 삽입합니다.


8
둘 다 구문이 다릅니다. 업데이트는 여러 인수 ({condition}, {update to doc}, upsert, multi)를 사용하지만 save는 하나의 인수 만 허용합니다 (_id는 조건 인수의 매개 변수 임). 업데이트는 모든 조건을 승인 할 수 있지만 save는 _id 필드.
Rahul

1
버전 2.6부터 save에는 쓰기 문제를 나타내는 문서를 취하는 두 번째 인수가 있습니다. docs.mongodb.org/manual/reference/method/db.collection.save
huggie

77

저장을 위해 두 가지 경우를 고려하십시오.

1) doc에 _id가 있습니다.

2) doc에 _id가 없습니다.

                        Save ()
                        /     \
                       /       \

                 Having _id     Not Having _id 

  ->In this case save will do    ->  It will do normal insertion 
    upsert to insert.Now             in this case as insert() do.
    what that means, it means 
    take the document and replace 
    the complete document having same
    _id.

삽입에 대한 두 가지 경우를 고려해 보겠습니다.

1) doc의 _id를 수집합니다.

2) _id of doc이 컬렉션에 없습니다.

                        Insert()
                       /        \
                      /          \

   Doc Having _id in collection    Doc Not Having _id 
  ->  E11000 duplicate key     ->Insert a new doc inside the collection.
      error index:       

10
다음 레벨 다이어그램
John Spiteri

2
다이어그램을 깔끔하게 그리고 표현하는 데 걸린 시간 동안 찬성했습니다.
fanbondi

36

save 문서를 삽입하거나 업데이트하십시오.

insert 삽입 만합니다.

그러나 귀하의 경우 저장에 제공된 문서에 _id필드 가 없으므로 동일한 작업을 수행합니다 .


13

예를 들어서

사과 저장

db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })

db.fruit.find();

{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "red",
    "shape" : "round",
    "name" : "apple"
}

이전에 저장된 사과의 _id로 사과 저장

db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple", 
"color":"real red","shape":"round"})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

우리가 저장 한 사과는 빨간색에서 실제 빨간색으로 색상이 업데이트되었습니다.

db.fruit.find();
{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "real red",
    "shape" : "round",
    "name" : "apple"
}

_id를 사용하여 사과 저장

db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})

    WriteResult({ "nMatched" : 0, "nUpserted" : 1, 
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })

동일한 개체 ID를 가진 사과가 없어서 Apple이 삽입되었습니다.

오렌지 삽입

db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })

주황색 삽입

db.fruit.find();
{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "real red",
    "shape" : "round",
    "name" : "apple"
}
{
    "_id" : ObjectId("53fa196d132c1f084b005cd7"),
    "color" : "orange",
    "shape" : "round",
    "name" : "orange"
}
{
    "_id" : ObjectId("55551809132c1f084b005cd0"),
    "color" : "real red",
    "shape" : "round",
    "name" : "apple"
}

따라서 객체 ID와 함께 제공된 경우 save는 업데이트와 같은 역할을합니다. 객체 ID가 이미 다른 방법으로 삽입되어 있으면 삽입됩니다.


10

동일한 콜렉션에서 이전에 사용 된 ID로 "삽입"을 사용하려고하면 중복 키 오류가 발생합니다. 이미 동일한 컬렉션에있는 ID로 "저장"을 사용하면 업데이트 / 덮어 쓰기됩니다.

진정한 업데이트를 원한다면 "update"를 사용하는 것이 좋습니다. 컬렉션에 이미있는 동일한 ID를 사용하여 저장하는 경우 업데이트가 저장과 같은 방식으로 덮어 쓰지 않습니다.

예를 들어 "x"와 "y"라는 두 개의 필드가 있고 둘 다 유지하고 "x"값을 변경하려고합니다. "save"명령을 선택하고 y를 이전 값과 함께 포함하지 않거나 저장에 y가 전혀없는 경우 y는 더 이상 같은 값을 가지지 않거나 존재하지 않습니다. 그러나 $ set을 사용하여 업데이트하기로 선택하고 업데이트 문에 x 만 포함하면 y에는 영향을 미치지 않습니다.



3

아래 문서를 고려하십시오

{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }

db에 이미 _id : 1 인 문서가 포함 된 경우

저장 작업은 아래와 같은 예외를 발생시킵니다

E11000 duplicate key error index ...........

삽입 작업으로 문서를 무시합니다.


db.collection.save()메소드는 동일한 _id를 가진 문서가 데이터베이스에 이미 존재하는 경우 문서를 업데이트합니다. 데이터베이스에 동일한 _id를 가진 문서가 이미 존재하면 save 메소드는 문서를 새 문서로 완전히 바꿉니다. 책에서-MongoDB Development
Jack blank

1

ORACLE의 관점에서 : mongo insert => Oracle insert mongo save => Oracle merge


1

db.<collection_name>.save(<Document>) InsertOrUpdate Query와 같습니다.

반면, db.<collection_name>.insert(<Document>)쿼리 삽입과 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.