如何通过 r2d2 和 actix 将文档保存在 MongoDB 中?
How to save a document in MongoDB by r2d2 and actix?
我是 Rust 的新手,正在尝试使用 Actix-web 创建一个网络服务器以通过 MongoDB 执行 CRUD 操作。我创建的第一个 API 是通过从 POST 请求中收到的内容将一个简单的文档保存在 MongoDB 中。 post 请求处理函数的代码是:
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
已过时且不再受支持,r2d2
crate marks it as:
deprecated: official driver handles pooling internally
所以我建议你不要使用它。您应该可以使用 mongodb::Client
or mongodb::Database
而不是 Pool<MongodbConnectionManager>
.
错误的原因是 r2d2-mongodb
使用旧版本的 mongodb
(0.3),因此旧版本的 bson
(0.13) 与该版本不兼容bson
您正在使用 (1.1.0)。您可能也会遇到与 mongodb
板条箱本身类似的兼容性问题。您可以通过降低依赖性来修复它:
mongodb = "0.3.0"
bson = "0.13.0"
不过,正如我之前提出的,我不推荐它。
我是 Rust 的新手,正在尝试使用 Actix-web 创建一个网络服务器以通过 MongoDB 执行 CRUD 操作。我创建的第一个 API 是通过从 POST 请求中收到的内容将一个简单的文档保存在 MongoDB 中。 post 请求处理函数的代码是:
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
已过时且不再受支持,r2d2
crate marks it as:
deprecated: official driver handles pooling internally
所以我建议你不要使用它。您应该可以使用 mongodb::Client
or mongodb::Database
而不是 Pool<MongodbConnectionManager>
.
错误的原因是 r2d2-mongodb
使用旧版本的 mongodb
(0.3),因此旧版本的 bson
(0.13) 与该版本不兼容bson
您正在使用 (1.1.0)。您可能也会遇到与 mongodb
板条箱本身类似的兼容性问题。您可以通过降低依赖性来修复它:
mongodb = "0.3.0"
bson = "0.13.0"
不过,正如我之前提出的,我不推荐它。