Rust中MongoDB批量操作:不存在则插入全文档,存在则更新指定字段
批量实现MongoDB的Upsert逻辑(插入/更新二选一)
我想找到调用次数最少的最优方案,批量执行以下伪代码逻辑(而非逐个迭代处理):
match find(doc) { Some(x) => x.update(select_fields), None=>collection.insert(all_fields) }
我的使用场景
我手里有一个HashMap<T, MyStruct>,已经把键值对打包成doc!{}结构,请问这样的批量处理方案可行吗?
此前我遇到key3字段的trait From<u64> is not implemented for Bson错误,于是把代码改成了用f64类型:
let dmp_op = my_database.lock().unwrap().clone(); let mut dmp_db = vec![]; for (k,v) in dmp_op{ dmp_db.push(doc! { "key": value, "key2": value2, "key3": value3 as f64 }, ) }; match collection.insert_many(dmp_db, None).await{ Ok(x)=>x, Err(x)=>{ println!("{:?}",x); continue } };
这段代码能运行,但无法重复执行——重复运行会插入重复数据,而不是更新已有数据。我需要从头实现开头那种Upsert逻辑的最优方案。
关于批量Upsert的疑问
我没找到find_one_and_update()搭配upsert参数的单条操作,能不能扩展成批量操作的相关资料,想确认这种思路是否可行。
架构方案选择
作为MongoDB新手,我开始怀疑自己的架构逻辑,想请教以下两种方案哪个更合理:
- 在工作线程中逐个向MongoDB执行插入/更新,不使用本地HashMap缓存
- 单独开一个线程,定期把本地HashMap里的数据批量插入MongoDB后清理缓存,节省资源
内容的提问来源于stack exchange,提问作者tommy1213
相关产品推荐
相关产品推荐

