【发布时间】:2019-04-17 21:06:55
【问题描述】:
当使用Rust Mongo driver prototype 时,结构中的日期时间字段被序列化为Strings 而不是ISODates。如何将字段保存为ISODate?
use chrono::{DateTime, Utc};
use mongodb::oid::ObjectId;
use mongodb::{
coll::Collection, db::Database, db::ThreadedDatabase, error::Error, Client, ThreadedClient,
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
struct Person {
pub _id: ObjectId,
pub date: DateTime<Utc>,
}
fn main() {
let client = Client.with_uri("mongodb://localhost:27017").unwrap();
let p = Person {
_id: ObjectId::new().unwrap(),
date: Utc::now(),
};
let document = mongodb::to_bson(p).unwrap().as_document();
if document.is_some() {
client
.db("my_db")
.collection("mycollection")
.insert_one(document, None)
.unwrap();
}
}
在查询数据库时,记录包含一个日期字符串(ISO 格式);我希望它是ISODate。
【问题讨论】:
-
尝试使用
UtcDateTime -
是的,我知道
UtcDatetime会起作用。然而,就像i32、i64或String一样,我不必在我的结构中使用bson::Bson::String或bson::Bson::I32或bson::Bson::I64,序列化程序应该透明地处理转换。在结构字段上添加变体也是一种可接受的解决方案。 -
那不可能
mongodb不能为Serialize实现DateTime,他们需要一个包装器,看起来bson拥有它并分享它。为什么不使用它? -
官方驱动也有同样的问题。如果我放置一个序列化的结构,它会写入一个字符串,但是当我使用带有
Utc的 doc 更新它时,它会写入无法反序列化的数据????