python - 使用 mongodb $push 和 $pull 支持(点赞)函数
问题描述
我正在尝试为我的书评应用程序创建类似/不同的功能。用户应该能够喜欢或不喜欢(删除喜欢投票)给定的评论,并且他们应该限制为每条评论只有一个喜欢。
在这种情况下,我正在使用 mongodb 并查看文档如下所示:
_id: ObjectId()
title: string
author:
publication_year: string
type: string
genre: string
cover: string
summary: string
review: string
added_by: string
upvote: array #(list of users that liked the review)
所以我试图构建的函数首先应该检查用户用户名是否在数组中,如果是,它应该拉/删除记录(用户名),如果不是,它应该推入数组中的记录。
这就是我现在所拥有的,但我无法让它发挥作用:
@app.route('/upvote/<review_id>', methods=['GET', 'POST'])
def upvote(review_id):
username = current_user.get_id()
upvoted = mongo.db.reviews.find( { '_id' : ObjectId(review_id) },
{ 'upvote' : { '$elemMatch':
{ 'username' : username } } } ).count()
if upvoted > 0:
mongo.db.reviews.update({ "_id": ObjectId(review_id) },
{ '$pull':
{ 'upvote':
{'username': username} } } )
else:
mongo.db.reviews.update({ "_id": ObjectId(review_id) },
{ '$push':
{ 'upvote':
{'username': username} } } )
return redirect(url_for('view_review', review_id=review_id))
你能告诉我我做错了什么吗?
在此先感谢您的帮助。
解决方案
我实际上发现我使用的是旧的 Pymongo 函数count()
而不是count_documents()
. 所以我的代码应该是这样的:
`@app.route('/upvote/', methods=['GET', 'POST']) def upvote(review_id):
username = current_user.username
match_count = mongo.db.reviews.count_documents({
'_id' : ObjectId(review_id),
'upvote': {'$elemMatch': { "username": username}},
})
if match_count > 0:
print("not equal to 0")
mongo.db.reviews.update({ "_id": ObjectId(review_id) },
{ '$pull':
{ 'upvote':
{'username': username} } } )
else:
print("equal to 0")
mongo.db.reviews.update({ "_id": ObjectId(review_id) },
{ '$push':
{ 'upvote':
{'username': username} } } )
return redirect(url_for('view_review', review_id=review_id))`
推荐阅读
- optaplanner - 为什么在调用 calculateScore 之前没有设置我的 PlanningVariables?
- python - DISCORD PY Bot 没有响应命令,没有回溯错误
- javascript - 如何获取在 Chrome 标签中播放的音频名称
- javascript - 在 div 外部单击应该为 div 添加抖动效果;点击里面不应该有任何变化
- discord.py - 将排行榜分为页面 discord.py
- javascript - 顺序 API 调用,我使用 Promise.all 还是迭代函数?
- google-apps-script - Google 表格:具有动态变化的自定义功能
- javascript - TypeError:SnakeGame 不是构造函数
- php - 将旧的 mysql 调用重写为新的 mysqli_real_query
- amazon-web-services - 发送 POST 请求返回“文本为空”