我正在尝试为我的项目(这是一个书评应用)创建喜欢/不喜欢的功能。用户应该能够喜欢或不喜欢(删除喜欢的票)给定的评论,并且每个评论只能被限制为一个。

我正在与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))



您能告诉我我在做什么错吗?

在此先感谢您的帮助。

最佳答案

鉴于此输入:

var r = [
{"_id": 0, upvote: [ {username: "A"}, {username: "B"} ] },
{"_id": 1, upvote: [ {username: "C"}, {username: "D"} ] },
{"_id": 2, upvote: [ {username: "A"}, {username: "D"} ] }
 ];


然后使用var reviewId = 2; var username = "C";C添加到upvote数组中,因为它不存在:

var d = db.foo.findOne({_id:reviewId, "upvote.username":username});
if(d != null) {
    // Found, so pull it out:
    rc = db.foo.update({ "_id": reviewId},
                  { '$pull': { 'upvote': {'username': username}}});
} else {
    // Not found, so add it:
    rc = db.foo.update({ "_id": reviewId},
                  { '$push': { 'upvote': {'username': username}}});
}


产量:

{
    "_id" : 2,
    "upvote" : [
        {
            "username" : "A"
        },
        {
            "username" : "D"
        },
        {
            "username" : "C"
        }
    ]
}



再次调用则相反。找到C,因此将其从数组中拉出。

关于python - 使用mongodb $ push和$ pull支持upvote(like)函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58750822/

10-09 14:51