MongoDB find_one每次即使没有匹配也都会返回文档的数组

问题描述 投票:1回答:1

进行尝试,以便我可以检查用户以前是否喜欢某个食谱,因此他们不会两次都喜欢。我的数据库中有以下用户:

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是否在数组中,它都只是返回。我认为这是因为它在做两个查询。有没有一种方法可以指定第二个查询以仅查看该特定用户?

python mongodb flask mongodb-query pymongo
1个回答
2
投票

问题在于您在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()

© www.soinside.com 2019 - 2024. All rights reserved.