PyMongo添加电子邮件?

时间:2014-01-22 23:14:45

标签: python mongodb flask pymongo

我目前正在开发Flask和Heroku应用程序,并使用MongoDB来保存用户注册信息。我遇到的问题是,当我尝试保存电子邮件时,它会给我一个错误:

InvalidDocument: key 'email@domain.com' must not contain '.'

我还想知道如何确保每封电子邮件都是唯一的,以前不在数据库中,而不必查询数据库。

这是我到目前为止的代码:

import os
import re
from pymongo import MongoClient
from flask import Flask, render_template, request, session, redirect
import jinja2

email_regex = re.compile(r"^[\S]+@[\S]+\.[\S]+$")
password_regex = re.compile(r'^[a-zA-Z]\w{3,14}$')

client = MongoClient("mongodb://<user>:<password>@linus.mongohq.com:11077/users")
db = client.get_default_database()
users = db.users


app = Flask(__name__)
@app.route('/signup', methods=['GET','POST'])
def signup():
    if request.method == 'POST':
        email = request.form.get('email')
        name = request.form.get('name')
        password = request.form.get('password')
        v_password = request.form.get('v_password')
        if email == '' or name == '' or password=='' or v_password =='':
            return render_template('signup.html', b_error="Cannot leave any field blank")
        elif not(email_regex.match(email)):
            return render_template('signup.html', e_error="Please enter valid email!")
        elif not(password_regex.match(password)):
            return render_template('signup.html', p_error="Please enter valid password")
        elif password != v_password:
            return render_template('signup.html', m_error="Passwords do not match")
        else:
            users.insert({name:name, email:email,password:password})
            return redirect('/')
    return render_template('signup.html')

无论如何,我可以为数据库设置一个模型,以便我可以将电子邮件设置为唯一,使字段不是必需/必需的,并允许我保存电子邮件?

1 个答案:

答案 0 :(得分:1)

确保集合中的值唯一的最佳方法是使用唯一索引。

在MongoDB shell中它将是:

db.users.ensureIndex({email: 1, unique: true})

使用PyMongo就像:

users.ensure_index([('email', 1)], unique=True)

这些示例中的1按升序对索引中的值进行排序。这应该足以供您使用。 PyMongo提供pymongo.ASCENDINGpymongo.DESCENDING作为便利。

有更多详情可供in the docs