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

MongoDB 修改数据

本章将讨论 MongoDB 修改已有数据、替换已有数据、修改或插入新数据的方法。

修改已有数据

pub async fn update(
    State(state): State<ArcAppState>,
    Json(frm): Json<form::UpdateNote>,
) -> Result<Json<u64>> {
    let n = state
        .note_collect()
        .update_one(
            doc! {"_id": &frm.id},
            doc! {"$set": {"title": &frm.title, "content": &frm.content}},
        )
        .await?;
    Ok(Json(n.modified_count))
}

通过 update_one() 方法可以对数据进行修改,它接收两个参数:

  • 修改条件,只有满足该条件数据才会进行修改。我们使用的是指定主键
  • 要修改的数据
    • 通过 $set 运算符,指定要修改哪些字段
    • 提供具体在字段和值
  • update_one() 用于修改单条数据
  • 如果要修改多条数据,使用 update_many()

测试:

结果:

HTTP/1.1 200 OK
content-type: application/json
content-length: 1
connection: close
date: Fri, 06 Jun 2025 06:56:57 GMT

1

修改或插入数据

pub async fn update_or_insert(
    State(state): State<ArcAppState>,
    Json(frm): Json<form::UpdateNoteUpsert>,
) -> Result<Json<u64>> {
    let id = match &frm.id {
        Some(v) => v.to_string(),
        None => xid::new().to_string(),
    };
    let update_doc = match &frm.id {
        Some(_) => {
            doc! {"title": &frm.title, "content": &frm.content}
        }
        None => doc! {"title": &frm.title, "content": &frm.content,"created_at":chrono::Utc::now()},
    };
    let n = state
        .note_collect()
        .update_one(doc! {"_id": &id}, doc! {"$set": update_doc})
        .upsert(true)
        .await?;
    Ok(Json(n.modified_count))
}

测试:

## 修改或插入单条笔记【修改】
PATCH  http://127.0.0.1:9527
Content-Type: application/json

{
    "id":"d100i1kdrfaihab7dmjg",
    "title":"note3 <UPDATED_1>",
    "content":"笔记 <UPDATED_1>"
}

## 修改或插入单条笔记【插入】
PATCH  http://127.0.0.1:9527
Content-Type: application/json

{
    "title":"note4",
    "content":"笔记4"
}

replace_one() 用于替换指定的记录。注意区分 replaceupdate

replace_one() 也可以设置 upsert(true),以便在记录不存在时进行插入。

pub async fn replace(
    State(state): State<ArcAppState>,
    Path(id): Path<String>,
    Json(frm): Json<form::CreateNote>,
) -> Result<Json<u64>> {
    let filter = doc! {"_id": &id};
    let node = model::Note {
        id,
        content: frm.content,
        title: frm.title,
        created_at: chrono::Utc::now(),
    };
    let n = state.note_collect().replace_one(filter, node).await?;
    Ok(Json(n.modified_count))
}

测试:

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