使用 $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/
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/