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() 方法可以对数据进行修改,它接收两个参数:

测试:

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

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

update_one()update_many() 设置 upsert(true),可以在记录不存在时进行插入操作:

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 用于将记录完整地替换,只保留主键不变。它是【整体修改】
  • update 用于更新指定的字符。它是【部分修改】

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

测试:

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

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