@@ -471,13 +471,14 @@ impl TableProvider for MongoTableProvider {
471471 let filter_doc = exprs_to_mongo_filter ( & filters, & self . primary_key ) ?;
472472 let mut set_doc = Document :: new ( ) ;
473473 for ( col, expr) in & assignments {
474+ if col == & self . primary_key {
475+ return Err ( DataFusionError :: Plan ( format ! (
476+ "Cannot modify primary key column '{}' — MongoDB disallows updating _id" ,
477+ self . primary_key
478+ ) ) ) ;
479+ }
474480 let value = expr_to_bson_value ( expr) ?;
475- let key = if col == & self . primary_key {
476- "_id" . to_string ( )
477- } else {
478- col. clone ( )
479- } ;
480- set_doc. insert ( key, value) ;
481+ set_doc. insert ( col. clone ( ) , value) ;
481482 }
482483 let update_doc = doc ! { "$set" : set_doc } ;
483484
@@ -1009,15 +1010,13 @@ fn exprs_to_mongo_filter(filters: &[Expr], primary_key: &str) -> DFResult<Docume
10091010 return Ok ( doc ! { } ) ;
10101011 }
10111012
1012- let mut combined = Document :: new ( ) ;
1013+ let mut parts = Vec :: with_capacity ( filters . len ( ) ) ;
10131014 for expr in filters {
10141015 match expr {
10151016 Expr :: BinaryExpr ( binary) => {
10161017 let part =
10171018 binary_expr_to_mongo ( & binary. left , & binary. op , & binary. right , primary_key) ?;
1018- for ( k, v) in part {
1019- combined. insert ( k, v) ;
1020- }
1019+ parts. push ( Bson :: Document ( part) ) ;
10211020 }
10221021 _ => {
10231022 return Err ( DataFusionError :: Plan ( format ! (
@@ -1027,7 +1026,7 @@ fn exprs_to_mongo_filter(filters: &[Expr], primary_key: &str) -> DFResult<Docume
10271026 }
10281027 }
10291028
1030- Ok ( combined )
1029+ Ok ( doc ! { "$and" : parts } )
10311030}
10321031
10331032/// The kind of DML operation to execute.
0 commit comments