prosource

Mongodb 중복 항목 방지

probook 2023. 6. 22. 21:58
반응형

Mongodb 중복 항목 방지

저는 mongodb의 초보자입니다.중복 입력을 방지하는 방법을 알 수 있을까요?관계형 테이블에서는 기본 키를 사용하여 이를 방지합니다.Java를 사용하여 Mongodb에서 지정하는 방법을 알 수 있습니까?

에서 인덱스 사용{unique:true}선택.

// everyone's username must be unique:
db.users.createIndex({email:1},{unique:true});

여러 필드에서 이 작업을 수행할 수도 있습니다.자세한 내용 및 예제는 문서의 이 섹션참조하십시오.

고유 인덱스를 사용하면 인덱싱된 필드에 중복된 값이 저장되지 않습니다. 즉, 인덱싱된 필드에 고유성이 적용됩니다.기본적으로 MongoDB는 컬렉션을 만드는 동안 _id 필드에 고유 인덱스를 만듭니다.

원하신다면null고유 키에서 무시할 값을 추가한 다음 인덱스를 희소하게 만들어야 합니다(여기 참조).sparse옵션:

// everyone's username must be unique,
//but there can be multiple users with no email field or a null email:
db.users.createIndex({email:1},{unique:true, sparse:true});

MongoDB Java Driver를 사용하여 인덱스를 생성하려는 경우.시도:

Document keys = new Document("email", 1);
collection.createIndex(keys, new IndexOptions().unique(true));

이 작업은 권장되지 않지만 "_id" 필드를 사용하여 수행할 수 있습니다.이름이 고유하기를 원한다고 가정하면 "_id" 열에 이름을 넣을 수 있으며 "_id" 열은 각 항목에 대해 고유합니다.

BasicDBObject bdbo = new BasicDBObject("_id","amit");

이제 컬렉션에서 다른 항목의 이름을 "amit"로 지정할 수 없습니다.이것은 당신이 요청하는 방법 중 하나일 수 있습니다.

Mongo의 v3.0 Java 드라이버를 기준으로 인덱스를 만드는 코드는 다음과 같습니다.

public void createUniqueIndex() {
    Document index = new Document("fieldName", 1);
    MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName");
    collection.createIndex(index, new IndexOptions().unique(true));
}

// And test to verify it works as expected
@Test
public void testIndex() {
    MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName");

    Document newDoc = new Document("fieldName", "duplicateValue");
    collection.insertOne(newDoc);

    // this will throw a MongoWriteException
    try {
        collection.insertOne(newDoc);
        fail("Should have thrown a mongo write exception due to duplicate key");
    } catch (MongoWriteException e) {
        assertTrue(e.getMessage().contains("duplicate key"));
    }
}

On 솔루션은 저에게 적합하지 않았지만, 이 솔루션은 다음과 같습니다.

BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);

나는 자바 프로그래머가 아니지만 당신은 아마 이것을 변환할 수 있을 것입니다.

MongoDB에는 기본적으로 다음과 같은 기본 키가 있습니다._id사용할 수 있습니다.upsert()또는save()문서가 이렇게 두 번 작성되는 것을 방지하기 위해 이 키를 사용합니다.

var doc = {'name': 'sam'};
db.users.insert(doc); // doc will get an _id assigned to it
db.users.insert(doc); // Will fail since it already exists

복제가 즉시 중지됩니다.특정 조건에서 멀티 스레드 세이프 인서트와 관련하여, 음, 우리는 그 경우 당신의 상태에 대해 더 많이 알아야 합니다.

하지만 덧붙여야 할 것은_id인덱스는 기본적으로 대기열이 아닙니다.

Pymongo를 사용하면 다음과 같이 보입니다.

mycol.create_index("id", unique=True)

여기서 myCol은 DB의 컬렉션입니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mycol.create_index("id", unique=True)
mydict = {"name": "xoce", "address": "Highway to hell 666", "id": 1}
x = mycol.insert_one(mydict)

mongoDB에서 중복 전자 메일 저장 방지

 UserSchema.path('email').validate(async(email)=>{
   const emailcount = await mongoose.models.User.countDocuments({email})
   return !emailcount
 }, 'Email already exits')

이것이 당신의 질문에 도움이 되기를...저를 위해 일했습니다.사용자 모델에서 사용합니다.설명을 참조하십시오. 감사합니다...

언급URL : https://stackoverflow.com/questions/12191311/mongodb-avoid-duplicate-entries

반응형