使用 $max 更新 MongoDB 集合文档

Upserting a MongoDB collection doc with $max

TL;DR 似乎只实现了最后一个 $max 语句

你好,我正在尝试根据新传入值是否大于使用 pymongo 存储的值来添加或更新数据

 {
 'site': 'xyz.com', 
 'site_data': 
     {'particular_aspect_about_site':{'score_1': 2, 'score_2': 2, 'score_3': 1}}, 
     `enter code here`{'a_different_aspect_about_site': {'score_a': 3, 'score_b': 1, 'score_c': 4}},
  }

我正在尝试的是

def upsert_site_data():

site_to_upsert = None
data_to_upsert = None
json_object = request.get_json()
if "site" in json_object:
    site_to_upsert = json_object["site"]
    data_to_upsert = { "site" : site_to_upsert}
    ###### check if data was collected
   
    if "site_data" in json_object:
        data_to_upsert.update(json_object["site_data"])
        
    collection_name = mongo.db.SiteData # establish mongo db instance to work with
    try:             
        result = collection_name.update_one({"site" : site_to_upsert,
                                            },  
                                            
                                            {
                                                "$max" : { "particular_aspect_about_site.score_2" : data_to_upsert["particular_aspect_about_site"]["score_2"]} ,
                                                "$max" : { "particular_aspect_about_site.score_3" : data_to_upsert["particular_aspect_about_site"]["score_3"]},
                                                "$max" : { "a_different_aspect_about_site.score_b" : data_to_upsert["a_different_aspect_about_site"]["score_b"]},
                                            }                                                
                                            ,
                                            upsert = True) 
       
        if result.raw_result["updatedExisting"] != True:
            return jsonify({"status": "ok"}) , 200

        if result.raw_result["updatedExisting"] == True:
            return jsonify({"error": "Site data was not updated, thanks though :D "}), 200

    except Exception as e:
        return jsonify({"error": e}) , 400

else: 
    return jsonify({"error": "A site must be refenced"}) , 400

问题出在更新函数的更新部分中的 $max 语句。 它只会实现最终的最大值。

我也试过其他方法不太成功,比如

    {
          "$max" : [
        { "particular_aspect_about_site.score_2" : data_to_upsert["particular_aspect_about_site"]["score_2"]},
 { "particular_aspect_about_site.score_3" : data_to_upsert["particular_aspect_about_site"]["score_3"]}, 
{ "a_different_aspect_about_site.score_b" : data_to_upsert["a_different_aspect_about_site"]["score_b"]}
                   ]
     }   
        

所以这是我的错误,我做到了

  { "$max" : { "particular_aspect_about_site.score_2" : data_to_upsert["particular_aspect_about_site"]["score_2"]} ,
    "$max" : { "particular_aspect_about_site.score_3" : data_to_upsert["particular_aspect_about_site"]["score_3"]},
    "$max" : { "a_different_aspect_about_site.score_b" : data_to_upsert["a_different_aspect_about_site"]["score_b"]},
 } 

但我应该使用这个模板

{ $max: { field1: value1, field2: value2 ... } }

来自 [geeks4geeks][1]

现在看起来像

    { "$max" :  { 
      "particular_aspect_about_site.score_2" : data_to_upsert["particular_aspect_about_site"]["score_2"] ,
      "particular_aspect_about_site.score_3" : data_to_upsert["particular_aspect_about_site"]["score_3"],
      "a_different_aspect_about_site.score_b" : data_to_upsert["a_different_aspect_about_site"]["score_b"]},
         } 

做我现在想要的。我确信有更好的方法来做到这一点,当我找到它时,我会 post,做我现在需要的 [1]: https://www.geeksforgeeks.org/mongodb-maximum-operator-max/