FAQ
이 페이지의 내용
이 페이지에서는 자주 묻는 질문과 해당 답변을 찾을 수 있습니다.
팁
이 페이지에서 질문에 대한 답변 을 찾을 수 없는 경우 문제 및 도움말 페이지에서 문제를 신고하는 방법에 대한 정보를 참조하세요.
MongoDB에 연결하는 동안 오류가 발생하는 이유는 무엇인가요?
MongoDB deployment에 연결하는 데 문제가 있는 경우 연결 문제 해결 가이드에서 가능한 해결 방법을 참조하세요.
Rust 드라이버에서 연결 풀링은 어떻게 작동하나요?
MongoDB cluster 의 각 서버 는 연결 풀 을 유지 관리합니다. 클라이언트 인스턴스 를사용하여 연결 풀 의 동작에 액세스 하거나 동작을 관리 할 수 있습니다. 연결 풀은 멀티스레드 애플리케이션 에서 동시 작업을 지원 하기 위해 온디맨드 방식으로 소켓을 엽니다.
다음과 같은 연결 풀 기능을 구성할 수 있습니다.
최대 및 최소 크기,
max_pool_size
및min_pool_size
옵션으로 설정풀이 병렬로 생성하는 최대 연결 수(
max_connecting
옵션으로 설정)최대 유휴 시간,
max_idle_time
옵션으로 설정
연결 풀링에 대한 자세한 내용은 성능 고려 사항 가이드의 연결 풀 섹션을 참조하세요.
BSON과 Rust 유형을 서로 변환하려면 어떻게 해야 하나요?
Rust 드라이버와 BSON 라이브러리는 Serde 프레임워크를 사용하여 사용자 지정 Rust 유형과 BSON 간의 변환을 수행합니다. Cargo.toml
파일에 serde
크레이트를 추가하여 Serde 프레임워크의 기능에 액세스할 수 있습니다. 이 크레이트를 추가하는 방법에 대한 지침은 serde 를 참조하세요. 을(를) 클릭합니다.
애플리케이션에 크레이트를 추가한 후 BSON 문서 대신 사용자 지정 유형을 사용하여 collection의 문서를 모델링할 수 있습니다. 다음 예제에서는 필요할 때 드라이버가 다음 조치를 수행하도록 지시하는 Vegetable
구조체 정의 앞에 derive
속성이 포함되어 있습니다.
구조체를 BSON으로 변환하는 구조체를 직렬화합니다.
BSON 데이터를 구조체로 변환하는 BSON 역직렬화
struct Vegetable { // Add struct fields here }
그런 다음 사용자 지정 구조체 유형을 일반 유형 매개변수로 사용하여 Collection
인스턴스를 만들 수 있습니다. 다음 예제에서는 Vegetable
유형으로 매개변수화된 Collection
인스턴스를 my_coll
변수에 할당합니다.
let my_coll: Collection<Vegetable> = client.database("db").collection("vegetables");
BSON과 Rust 유형 간의 변환에 대한 자세한 내용은 데이터 모델링 및 직렬화 가이드 및 Rust MongoDB 개발자 센터의 Serde를 사용한 데이터 구조화 문서를 참조하세요.
충족되지 않은 트레이트 바운드 오류는 어떻게 해결하나요?
트레이트 바운드를 사용하면 메서드에서 매개변수로 허용하는 유형과 해당 유형이 구현해야 하는 기능을 제한할 수 있습니다. 예를 들어, 제네릭 유형 매개변수를 허용하고 해당 값을 출력하는 메서드를 정의하는 경우, 해당 매개변수는 출력을 위해 Display
특성을 구현해야 합니다. 다음 예에서는 printer()
메서드를 정의하고 해당 매개변수가 Display
을 구현하도록 지정합니다.
fn printer<T: Display>(t: T) { println!("{}", t); }
데이터 유형으로 메서드를 호출할 때 해당 메서드의 특성 경계가 충족되지 않는다는 오류가 발생할 수 있습니다. 예를 들어, Cursor
인스턴스에서 try_next()
메서드를 호출하면 드라이버에서 다음과 같은 오류 메시지가 표시될 수 있습니다.
error[E0599]: the method `try_next` exists for struct `mongodb::Cursor<T>`, but its trait bounds were not satisfied
Cursor<T>
유형은 T
의 특성 경계가 충족되는 경우 try_next()
메서드에 액세스하는 데 필요한 Stream
특성만 구현합니다. T
즉, 는 DeserializeOwned
커서 에 지정된 대로 트레이트를 구현해야 합니다. API 문서. 다음 예제에서는 actors
컬렉션의 모델링 문서에 사용자 지정 Actor
구조체를 정의하여 앞의 오류 메시지를 복제합니다. 그러나 이 구조체는 DeserializeOwned
특성을 구현하지 않으며, try_next()
메서드를 사용하여 Actor
인스턴스를 반복하면 오류가 발생합니다.
struct Actor { name: String, } // Add setup code here let my_coll: Collection<Actor> = client.database("db").collection("actors"); let mut cursor = my_coll.find(doc! {}).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); };
특성 경계 오류를 해결하려면 커서가 반복되는 데이터 유형을 식별하고 이 데이터 유형이 DeserializeOwned
특성을 구현하는지 확인하십시오. derive
속성을 사용하여 필요한 트레이트 바운드를 적용할 수 있습니다.
참고
소유 트레이트 역직렬화 및 역직렬화
serde
크레이트는 Deserialize
트레이트를 포함한 특정 트레이트의 구현을 생성하는 파생 매크로를 제공합니다. 그러나 이 크레이트는 DeserializeOwned
트레이트에 대한 파생 매크로를 제공하지 않습니다. 수명 제한 없이 Deserialize
을 구현하는 데이터 유형은 자동으로 DeserializeOwned
을 구현하므로 Deserialize
를 구현하여 DeserializeOwned
특성 경계를 충족할 수 있습니다.
다음 예에서는 Actor
구조체 정의를 조정하여 Deserialize
을 구현합니다.
struct Actor { name: String, }
특성 경계에 대한 자세한 내용은 다음 리소스를 참조하세요.
커뮤니티 포럼의 커서 특성 경계 질문
바운드 Rust 언어 문서에서
파생 Rust 언어 문서에서
결과 또는 옵션 열거형에 래핑된 값을 처리하려면 어떻게 해야 하나요?
Rust는 애플리케이션 코드에 대한 보호 장치로 Result
및 Option
열거형을 제공합니다. Rust 드라이버가 제공하는 많은 메서드는 이 두 가지 유형 중 하나로 래핑된 값을 반환합니다.
Result
열거형은 다음과 같은 변형을 반환할 수 있습니다.
Ok(T)
: 연산 결과의 값을 래핑합니다.Err(E)
: 작업이 실패하면 오류 값을 래핑합니다.
예를 들어, insert_one()
메서드는 Result
유형을 반환하여 성공적인 응답이나 오류를 래핑합니다.
insert_one()
의 래핑되지 않은 결과에 액세스하려면 ?
연산자를 사용합니다. 작업이 성공하면 메서드는 Result
열거형의 Ok(InsertOneResult)
변형을 반환합니다. 이 경우 ?
연산자는 InsertOneResult
값을 래핑 해제하여 insert_one_result
변수에 할당합니다. 작업이 실패하면 메서드는 Err(E)
열거형 변형을 반환하고 ?
연산자는 래핑을 해제하여 오류 값을 반환합니다. 다음 코드에서는 삽입 작업 결과를 처리하는 동안 ?
연산자를 사용하는 구문을 보여 줍니다.
let insert_one_result = my_coll.insert_one(doc).await?;
또는 InsertOneResult
의 래핑되지 않은 값을 처리하는 조건을 만들 수 있습니다. 다음 코드는 match
키워드를 사용하여 insert_one()
결과를 처리합니다.
let insert_one_result = my_coll.insert_one(doc).await; match insert_one_result { Ok(val) => { println!("Document inserted with ID: {}", val.inserted_id); }, Err(err) => { println!("Operation not successful"); } }
Option
열거형은 다음과 같은 변형을 반환할 수 있습니다.
None
: 작업에서 반환된 빈 값을 나타냅니다.Some(T)
: 비어 있지 않은 반환 값을 래핑합니다.
일부 Rust 드라이버 메서드는 read_concern()
메서드와 같은 Option
유형을 반환합니다. 이 메서드는 읽기 고려 (read concern)가 없는 경우 빈 값을 래핑하거나 ReadConcern
값을 래핑하는 Option
을 반환합니다.
read_concern()
의 결과에 액세스하려면 앞의 예에 표시된 것과 동일한 match
구문을 사용하여 None
및 Some(T)
변형을 처리하면 됩니다. 또는 if let
구문을 사용하여 Some(T)
변형만 처리할 수 있습니다. 다음 코드는 비어 있지 않은 read_concern()
반환 값이 있는 경우 래핑을 해제하고 출력합니다.
if let Some(rc) = my_coll.read_concern() { println!("Read concern: {:?}", rc); }
Result
및 Option
열거형에 대한 자세한 내용은 Rust 언어 문서에서 다음 리소스를 참조하세요.