programing

mongodb 문서의 ID 유형으로 String을 사용할 수 있습니까?

powerit 2023. 7. 2. 21:04
반응형

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

반응형