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

测试:

## 修改单条笔记
PUT http://127.0.0.1:9527
Content-Type: application/json

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

结果:

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

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))
}

测试:

## 替换笔记
PUT http://127.0.0.1:9527/d100i1kdrfaihab7dmjg
Content-Type: application/json

{
    "title":"note3 <REPLACED>",
    "content":"笔记 <REPLACED>"
}
要查看完整内容,请先登录