域名 AXUM.RS 将于 2025 年 10 月到期。我们无意再对其进行续费,如果你有意接续这个域名,请与我们取得联系。
  • AXUM.RS 现仅需人民币 3000 元(大写:叁仟元整。接受适度议价
  • 按照行业规则,AXUM.RS 到期后,大概率会进入长时间的赎回期,该期间内,如果你想拥有该域名,将要付出高额的费用
  • 我们已启用 AXUM.EU.ORG 域名,并将持续运营
  • 仅接受微信或支付宝交易
如果你对 AXUM.RS 有兴趣,请和我们进行联系:

MongoDB 聚合操作

单一聚合

count 由 Collection 提供的 count_documents() 方法实现。

我们来看一下修改后的分页:

#[derive(Serialize)]
pub struct Pagination<T> {
    pub page: u32,
    pub page_size: u32,
    pub total: u64,
    pub total_page: u64,
    pub data: Vec<T>,
}
impl<T> Pagination<T> {
    fn new(page: u32, page_size: u32, total: u64, data: Vec<T>) -> Self {
        let total_page = (total as f64 / page_size as f64).ceil() as u64;
        Self {
            page,
            page_size,
            total,
            total_page,
            data,
        }
    }
}
pub async fn list_pagination(
    State(state): State<ArcAppState>,
    Query(query): Query<PaginationRequest>,
) -> Result<Json<Pagination<model::Note>>> {
    let filter = doc! {};
    let count = state.note_collect().count_documents(filter.clone()).await?;
    let mut notes = vec![];
    let mut cursor = state
        .note_collect()
        .find(filter)
        .sort(doc! { "_id": -1})
        .skip(query.offset() as u64)
        .limit(query.limit() as i64)
        .await?;
    while cursor.advance().await? {
        let n = cursor.deserialize_current()?;
        notes.push(n);
    }
    let p = Pagination::new(query.page(), query.limit(), count, notes);
    Ok(Json(p))
}

聚合管道

聚合管道就是将多个聚合操作合并到一个管道中,以便在同一次查询中进行操作。聚合管道非常实用,但本专题用不上这些知识,所以可以自行在官网上查看文档。

要查看完整内容,请先登录