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