从pymongo游标获取特定属性

时间:2019-09-11 03:12:10

标签: flask pymongo

在我正在使用的Flask应用程序中,有一个登录端点,我需要在此查询mongodb数据库并获取用户的密码。当提供用户名时,我可以检索相应的用户记录,但是我想获取用户密码,该密码是用户记录的一部分。

@user.route('/login',methods = ['POST'])
def login():
    user_record = db.user.find({'username': request.json['username']})
    #return password

如果我尝试dumps(user_record),则会收到以下响应。

[{"_id": {"$oid": "5d785f9537b9d0ebcde1850a"}, "username": "pavindu", "password": {"$binary":
"JDJiJDEyJFZUQ2QzV1RRUmMubmZ1b0FxeTYxdXVkbVYuS09ZWFZJSDFGYzJGbVJMQUllbWdEcFJtZjRx", "$type": "00"}, "createdAt":
{"$date": 1568169877345}}]

因为它返回了一个列表,所以我认为要获取第一项并获取键“ password”的值。以下是我尝试过的内容以及通过POSTman测试时遇到的错误。 dumps(user_record)[0]返回[而不是字典。

return dumps(user_record)[0]['password']
TypeError: string indices must be integers

编辑

这是我的完整文件。我可以查询数据库并获取结果,但是不能从中获取特定的属性。我们非常感谢您的帮助。

from flask import Flask,request,Blueprint
from database import db
from bson import Binary, Code
from bson.json_util import dumps

user = Blueprint('user', __name__)

@user.route('/login',methods = ['POST'])
def login():
    user_record = db.user.find_one({'username': request.json['username']})
    return dumps(user_record)

我想在user_record中获得密码字段。我该怎么做?

1 个答案:

答案 0 :(得分:1)

编辑:

我做了一些简化,但这在python 3.7 / mongo 4.0上应该适用。如果这不起作用,那么您首先要解决一个更基本的问题。

from bson.json_util import dumps
from pymongo import MongoClient
import datetime

connection = MongoClient('localhost', 27017)
db = connection['yourdatabase']

db.testuser.insert_one({"username": "pavindu",
                    "password": "<password>",
                    "createdAt": datetime.datetime.now()})

request = {"username": "pavindu"}

def test_login():
    user_record = db.testuser.find_one({'username': request['username']})
    return dumps(user_record['password'])

print(test_login())

原始答案:

Find返回一个游标,您可以对其进行迭代。使用转储时,它将在光标上迭代并创建一个列表,这就是为什么您将结果视为列表的原因

我建议您使用find_one返回单个记录。

@user.route('/login',methods = ['POST'])
def login():
    user_record = db.user.find_one({'username': request.json['username']})