首页 > 解决方案 > 使用 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))

你能告诉我我做错了什么吗?

在此先感谢您的帮助。

标签: pythonmongodb

解决方案


我实际上发现我使用的是旧的 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))`

推荐阅读