gpt4 book ai didi

python - 使用 mongodb $push 和 $pull 的赞成(喜欢)功能

转载 作者:太空宇宙 更新时间:2023-11-03 20:10:14 26 4
gpt4 key购买 nike

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

我正在使用 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 的赞成(喜欢)功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58750822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com