进行尝试,以便我可以检查用户以前是否喜欢某个食谱,因此他们不会两次都喜欢。我的数据库中有以下用户:
username:"username"
password:"password"
likes:Array
0:"recipe_id"
我正在尝试使用查询:
if mongo.db.users.find_one({'username': session.get('USERNAME')}, {'likes': [recipe_id]}) == None:
mongo.db.recipe.update_one({'_id': ObjectId(recipe_id)}, {
'$inc': {'likes': 1}})
mongo.db.users.update_one({'username': session['USERNAME']}, {
'$push': {'likes': recipe_id}})
但是无论recipeId
是否在数组中,它都只是返回。我认为这是因为它在做两个查询。有没有一种方法可以指定第二个查询以仅查看该特定用户?
问题在于您在likes : [recipe_id]
的投影部分中有.find_one
。因此,它必须在过滤器部分,基本上.find()
或.find_one()
的第二个参数是投影,有助于在文档中投影某些字段。
尝试此查询:
/** So all you need is to check if `recipe_id` exists in `likes` array or not,
* then if it exists instead of returning entire doc,
* using projection just return `_id` of doc which is quiet enough for your need,
* in other case query will return none if no matching doc exists */
if mongo.db.users.find_one({'username': session.get('USERNAME'), 'likes': recipe_id}, {_id :1}) == None:
mongo.db.recipe.update_one({'_id': ObjectId(recipe_id)}, {
'$inc': {'likes': 1}})
mongo.db.users.update_one({'username': session['USERNAME']}, {
'$push': {'likes': recipe_id}})
在.find_one()
中,您不需要像正在做的那样将recipe_id
包装在数组中:不需要likes : [recipe_id]
,如果要这样做,则需要使用像$in这样的{ likes : {$in : [recipe_id] } }
运算符]放在查询的过滤器部分。
Ref: .findOne()和.find_one()