mongodb 문서의 ID 유형으로 String을 사용할 수 있습니까?
저는 mongodb를 처리하기 위해 java/morphia를 사용하고 있습니다.기본 ObjectId는 Java 계층에서 사용하기에 매우 편리하지 않습니다.ObjectId를 사용하여 키 생성 프로세스를 유지하면서 String 유형으로 만들고 싶습니다._id = new ObjectId.toString()
.
이런 식으로 하면 부작용이 있는지 알고 싶습니다.예를 들어, 데이터베이스 성능에 영향을 미치거나 어떤 방식으로든 주요 충돌을 일으킬 수 있습니까?샤딩 환경에 영향을 미칠까요?
모든 유형의 값을 사용할 수 있습니다._id
필드(어레이 제외).ObjectId를 사용하지 않기로 선택한 경우 값의 고유성을 보장해야 합니다(ObjectId를 문자열로 캐스팅하면 됩니다).중복 키를 삽입하려고 하면 오류가 발생하여 처리해야 합니다.
동일한 _id를 가진 두 문서를 다른 샤드에 삽입하려고 할 때 샤드 클러스터에 어떤 영향을 미칠지 모르겠습니다.삽입할 수 있을 것 같지만, 나중에 물어뜯을 것입니다. (이것을 테스트해 봐야겠습니다.)
그렇긴 하지만, 당신은 문제가 없을 것입니다._id = (new ObjectId).toString()
.
ObjectId를 JSON으로 변환하는 데 문제가 있어서 저도 같은 작업을 했습니다.
그리고 나서 저는 다음과 같은 것을 했습니다.
@Id
private String id;
public String getId() {
return id();
}
public void setId(String id) {
this.id = id;
}
그리고 이전에 삽입한 문서를 업데이트하기로 결정하기 전까지는 모든 것이 정상적으로 작동했습니다. Id가 JSON을 통해 페이지로 객체를 전송하고 JSON 게시물을 통해 동일한 업데이트된 객체를 수신한 후 데이터스토어에서 저장 기능을 사용했습니다.이전 데이터를 업데이트하는 대신 새 문서를 삽입했습니다.
더 나쁜 것은 새 문서가 이전에 삽입된 문서와 동일한 ID를 가지고 있다는 것입니다. 제가 불가능하다고 생각했던 것입니다.
어쨌든 나는 개인 객체를 객체로 설정했습니다.ID를 입력하고 문자열로 설정한 후 예상대로 작동했습니다. 그게 당신의 경우 생각에 도움이 될지 모르겠습니다.
@Id
private ObjectId id;
public String getId() {
return id.toString();
}
public void setId(String id) {
this.id = new ObjectId(id);
}
예, _id로 문자열을 사용할 수 있습니다.
(문서에) 고유의 키로 사용할 수 있는 가치가 있는 경우에만 사용하는 것이 좋습니다.저는 이 디자인을 "xxxxyyyy" 형식의 문자열 지리 태그가 있는 한 컬렉션에 사용했습니다. 이 문서별 고유 필드는 문서에 있어야 하고 인덱스를 작성해야 했습니다.키로 사용하는 것이 어떻습니까? (이것은 키-값 쌍 하나를 추가하는 것을 방지하고 MongoDB가 자연스럽게 "_id"에 인덱스를 구축하기 때문에 컬렉션의 두 번째 인덱스를 방지했습니다.컬렉션의 크기를 고려할 때, 이 두 가지 모두 상당한 공간 절약 효과를 얻었습니다.)
그러나 질문의 어조로 볼 때("개체")ID는 매우 편리하지 않습니다."), 문자열을 사용하려는 유일한 이유가 객체를 깔끔하게 관리하는 방법을 찾는 데 방해가 되지 않으려면신분증들... 시간을 내서 그들 주변을 둘러볼 가치가 있다고 제안합니다.그들은 문제가 되지 않을 거라고 확신합니다.당신이 그들과의 문제를 알게 되면.
그렇지 않은 경우: 옵션은 무엇입니까?앞으로 MongoDB를 사용할 때마다 문자열 ID를 구성할 것입니까?
자동으로 생성된 BSON Object를 사용하는 것이 항상 좋은 생각은 아니라는 점을 추가하고 싶습니다.고유 식별자로서의 ID(애플리케이션에 전달되는 경우): 사용자가 잠재적으로 조작할 수 있습니다.
개체 ID는 순차적으로 생성되는 것으로 나타나므로 필요한 권한 부여 메커니즘을 구현하지 못할 경우 악의적인 사용자가 자신이 가지고 있는 값을 증가시켜 액세스할 수 없는 리소스에 액세스할 수 있습니다.
업데이트: 3.4+ 버전 이후 개체ID는 더 이상 증분으로 생성되지 않습니다.최신 문서와 비교하여 3.2개 문서를 참조하십시오.
따라서 UUID 유형 식별자를 사용하면 보안을 통한 불투명 계층을 제공합니다.물론 권한 부여(이 사용자가 요청된 리소스에 액세스할 수 있는지 여부)는 필수 사항이지만, 앞서 언급한 개체를 알고 있어야 합니다.ID 기능.
두 월드를 모두 활용하려면 개체와 일치하는 UUID를 생성합니다.ID 길이(12자 또는 24자) 및 이를 사용하여 개체의 _id를 만듭니다.ID 유형.
자바에서도 문자열을 ID로 사용할 수 있습니다.다음은 MongoDB 컬렉션에 문자열 ID를 가진 하나의 개체를 삽입하는 방법 및 해당 Unit 테스트의 예입니다.
public Document insert(String json, String collectionName) {
MongoCollection<Document> collection = database.getCollection(collectionName);
BasicDBObject document = BasicDBObject.parse(json);
Document doc = new Document(document);
collection.insertOne(doc);
return doc;
}
@Test
void whenInsert_ShouldInsertOne() {
final String uuid = UUID.randomUUID().toString();
final String collection = "test_collection";
final Document doc = app.insert(String.format("{\"_id\":\"%s\", \"name\": \"test\"}",
uuid), collection);
assertThat(doc).isNotNull();
final String json = app.getById(uuid, collection);
assertThat(json).contains(String.format("\"_id\": \"%s\"", uuid));
}
언급URL : https://stackoverflow.com/questions/11090446/can-i-use-string-as-id-type-for-mongodb-document
'programing' 카테고리의 다른 글
GraphQL 스키마에서 맵 개체를 정의하는 가장 좋은 방법은 무엇입니까? (0) | 2023.07.02 |
---|---|
Oracle SQL 쿼리에서 선행 0을 추가하는 방법은 무엇입니까? (0) | 2023.07.02 |
전자: jQuery가 정의되지 않았습니다. (0) | 2023.07.02 |
git-diff의 출력에서 공백 색상 지정 (0) | 2023.07.02 |
MongoDB - 텍스트 필드의 인덱스와 텍스트 인덱스의 차이? (0) | 2023.07.02 |