我是Rust的新手,正尝试使用Actix-web创建Web服务器以通过MongoDB执行CRUD操作。我创建的第一个API是通过从POST请求接收到的东西将一个简单的文档保存在MongoDB中。发布请求处理程序函数的代码为:
extern crate r2d2;
extern crate r2d2_mongodb;
use r2d2::Pool;
use r2d2_mongodb::mongodb::db::ThreadedDatabase;
use r2d2_mongodb::{ConnectionOptions, MongodbConnectionManager};
use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder};
use bson::{doc, Bson, Document};
async fn post_request(info: web::Json<Info>, pool: web::Data<Pool<MongodbConnectionManager>>) -> HttpResponse {
let name: &str = &info.name;
let connection = pool.get().unwrap();
let doc = doc! {
"name": name
};
let result = connection.collection("user").insert_one(doc, None);
HttpResponse::Ok().body(format!("username: {}", info.name))
}
我正在使用r2d2为MongoDB建立连接池,而不是打开和关闭连接。我得到的错误是error[E0308]: mismatched types
--> src/main.rs:17:59
|
17 | let result = connection.collection("user").insert_one(doc, None);
| ^^^ expected struct `OrderedDocument`, found struct `bson::Document`
insert_one
函数文档说它接受bson::Document
,但是当我给它时,它说expected struct `r2d2_mongodb::mongodb::ordered::OrderedDocument`
这是我的Cargo.toml依赖项mongodb = "1.1.1"
actix-web = "3.3.2"
dotenv = "0.15.0"
r2d2-mongodb = "0.2.2"
r2d2 = "0.8.9"
serde = "1.0.118"
bson = "1.1.0"
我该如何纠正?
最佳答案
r2d2-mongodb
crate marks it as已过时且不再受支持:
deprecated: official driver handles pooling internally
因此,我建议您不要使用它。您应该能够使用
r2d2
或 mongodb::Client
而不是mongodb::Database
。错误的原因是
Pool<MongodbConnectionManager>
使用的是较旧版本的r2d2-mongodb
(0.3),因此使用的是较旧版本的mongodb
(0.13),它与您所使用的bson
(1.1.0)的版本不兼容。 bson
crate 本身也可能会遇到类似的兼容性问题。您可以通过降低依赖性来解决此问题:mongodb = "0.3.0"
bson = "0.13.0"
但是,正如我以前提到的那样,我不建议这样做。
关于mongodb - 如何通过r2d2和actix在MongoDB中保存文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65379841/