mgo가 삽입된 문서의 ID를 반환하지 않는 이유는 무엇입니까?
설명서(http://godoc.org/launchpad.net/mgo/v2) 에 따르면 Upsert 방법을 사용하면 "Uperserted" 문서의 ID를 얻을 수 있습니다.
이 기능을 제공하지 않는 Insert 메서드도 있습니다.
왜 그런 것일까요?Upsert 대신 Insert를 수행하려면 어떻게 해야 합니까?(아니면 그렇게 하고 싶어하는 타당한 이유가 되지 않을까요?궁금해지기 시작합니다.)
를 사용하여 삽입할 ID를 생성합니다.NewObjectId()
새 문서를 삽입하는 방법은 다음과 같습니다.
i := bson.NewObjectId()
c.Insert(bson.M{"_id": i, "foo": "bar"})
를 발행할 때 삽입할 것인지 업데이트할 것인지 알 수 없기 때문에Upsert
쿼리 직후에 ID를 삭제하기 위해 ID를 생성하는 것은 불필요합니다(업데이트가 발생하는 경우).그렇기 때문에 DB-side가 생성되고 해당될 때 사용자에게 반환됩니다.
이런 일이 전혀 일어나서는 안 됩니다. mgo는 ID를 삽입하고 반환해야 합니다. 애플리케이션 자체에서 ObjectId를 생성한 경우, 애플리케이션이 재시작되면 ObjectId 생성기가 처음부터 시작하여 동일한 ID를 계속 생성하여 데이터베이스의 기존 레코드를 업데이트합니다.
잘못된 것입니다. MGO는 Python이나 Java에서 MongoDB에 바인딩된 다른 언어가 좋아하는 것처럼 해당 ID를 생성하고 개체를 업데이트하거나 삽입된 개체의 objectId를 즉시 반환할 때 데이터베이스에 의존해야 합니다.
업서트 기능을 사용하여 생성된 ID를 얻을 수 있습니다.
db := service.ConnectDb()
sessionCopy := db.Copy()
defer sessionCopy.Close() // clean up
collection := sessionCopy.DB(service.MongoDB.DTB).C(MessageCol.tbl)
log.Println("before to write: ", msg)
// Update record inserts and creates an ID if wasn't set (Returns created record with new Id)
info, err := collection.Upsert(nil, msg)
if err != nil {
log.Println("Error write message upsert collection: ", err)
return MessageMgo{}, err
}
if info.UpsertedId != nil {
msg.Id = info.UpsertedId.(bson.ObjectId)
}
// gets room from mongo
room, err := GetRoom(msg.Rid)
if err != nil {
return msg, err
}
// increments the msgcount and update it
room.MsgCount = room.MsgCount + 1
err = UpdateRoom(room)
if err != nil {
return msg, err
}
return msg, err
이것은 제가 가지고 있는 샘플 코드이고 잘 작동합니다...
언급URL : https://stackoverflow.com/questions/12009312/why-does-mgo-not-return-the-id-of-inserted-document
'programing' 카테고리의 다른 글
python-requests 모듈의 모든 요청 기록 (0) | 2023.07.17 |
---|---|
pathlib.path에서 지정된 파일이 있는 폴더 이름을 가져오는 방법은 무엇입니까? (0) | 2023.07.17 |
"작업 친화적 동기화 컨텍스트 사용"의 의미는 무엇입니까? (0) | 2023.07.17 |
__eq_는 Python에서 어떻게 처리되고 어떤 순서로 처리됩니까? (0) | 2023.07.17 |
Excel 추가 기능 - 클릭 한 번 - VSTOInstaller.exe.config 파일, 무엇입니까? (0) | 2023.07.17 |