문서 메뉴
문서 홈
/ / /
Rust 드라이버

FAQ

이 페이지의 내용

  • MongoDB에 연결하는 동안 오류가 발생하는 이유는 무엇인가요?
  • Rust 드라이버에서 연결 풀링은 어떻게 작동하나요?
  • BSON과 Rust 유형을 서로 변환하려면 어떻게 해야 하나요?
  • 충족되지 않은 트레이트 바운드 오류는 어떻게 해결하나요?
  • 결과 또는 옵션 열거형에 래핑된 값을 처리하려면 어떻게 해야 하나요?

이 페이지에서는 자주 묻는 질문과 해당 답변을 찾을 수 있습니다.

이 페이지에서 질문에 대한 답변을 찾을 수 없는 경우 문제 및 도움말 페이지에서 문제를 신고하는 방법에 대한 정보를 참조하세요.

MongoDB deployment에 연결하는 데 문제가 있는 경우 연결 문제 해결 가이드에서 가능한 해결 방법을 참조하세요.

MongoDB cluster 의 각 서버는 연결 풀을 유지 관리합니다. 클라이언트 의 인스턴스를 사용하여 연결 풀의 동작에 액세스하거나 연결 풀의 동작을 관리할 수 있습니다. . 연결 풀은 멀티스레드 애플리케이션에서 동시 작업을 지원하기 위해 온디맨드 방식으로 소켓을 엽니다.

다음과 같은 연결 풀 기능을 구성할 수 있습니다.

  • 최대 및 최소 크기, max_pool_sizemin_pool_size 옵션으로 설정

  • 풀이 병렬로 생성하는 최대 연결 수( max_connecting 옵션으로 설정)

  • 최대 유휴 시간, max_idle_time 옵션으로 설정

연결 풀링에 대한 자세한 내용은 성능 고려 사항 가이드의 연결 풀 섹션을 참조하세요.

Rust 드라이버와 BSON 라이브러리는 Serde 프레임워크를 사용하여 사용자 지정 Rust 유형과 BSON 간의 변환을 수행합니다. Cargo.toml 파일에 serde 크레이트를 추가하여 Serde 프레임워크의 기능에 액세스할 수 있습니다. 이 크레이트를 추가하는 방법에 대한 지침은 serde 를 참조하세요. 을(를) 클릭합니다.

애플리케이션에 크레이트를 추가한 후 BSON 문서 대신 사용자 지정 유형을 사용하여 collection의 문서를 모델링할 수 있습니다. 다음 예제에서는 필요할 때 드라이버가 다음 조치를 수행하도록 지시하는 Vegetable 구조체 정의 앞에 derive 속성이 포함되어 있습니다.

  • 구조체를 BSON으로 변환하는 구조체를 직렬화합니다.

  • BSON 데이터를 구조체로 변환하는 BSON 역직렬화

#[derive(Serialize, Deserialize)]
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 을 구현합니다.

#[derive(Deserialize)]
struct Actor {
name: String,
}

특성 경계에 대한 자세한 내용은 다음 리소스를 참조하세요.

Rust는 애플리케이션 코드에 대한 보호 장치로 ResultOption 열거형을 제공합니다. 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 구문을 사용하여 NoneSome(T) 변형을 처리하면 됩니다. 또는 if let 구문을 사용하여 Some(T) 변형만 처리할 수 있습니다. 다음 코드는 비어 있지 않은 read_concern() 반환 값이 있는 경우 래핑을 해제하고 출력합니다.

if let Some(rc) = my_coll.read_concern() {
println!("Read concern: {:?}", rc);
}

ResultOption 열거형에 대한 자세한 내용은 Rust 언어 문서에서 다음 리소스를 참조하세요.

돌아가기

GridFS.

다음

연결 문제 해결