#python #json #mongodb #flask
#python #json #mongodb #flask
Вопрос:
Я делаю учебник по Flask. Я пытаюсь добавить некоторую информацию из файла json в базу данных MongoDB
users.json
[{"id":1,"first_name":"Jacques","last_name":"Blazewicz","email":"jblazewicz0@posterous.com","password":"k9doaly"},
{"id":2,"first_name":"Budd","last_name":"Zellick","email":"bzellick1@uol.com.br","password":"kik8N0cyKG"},
{"id":3,"first_name":"Simone","last_name":"Brenston","email":"sbrenston2@squarespace.com","password":"9BO7nEvdci8"},
{"id":4,"first_name":"Waneta","last_name":"Stading","email":"wstading3@google.es","password":"GpzWY536X"},
{"id":5,"first_name":"Barbey","last_name":"Corder","email":"bcorder4@csmonitor.com","password":"BXFkbgEz"},
{"id":6,"first_name":"Becca","last_name":"Hartington","email":"bhartington5@wsj.com","password":"ijh3RfxcGB"},
{"id":7,"first_name":"Elyse","last_name":"Eddy","email":"eeddy6@archive.org","password":"QJHg5Gc0V"},
{"id":8,"first_name":"Reggie","last_name":"Souster","email":"rsouster7@4shared.com","password":"nmCeQGRC"},
{"id":9,"first_name":"Brnaby","last_name":"Abrahmson","email":"babrahmson8@digg.com","password":"BqOgwfIMJmTx"},
{"id":10,"first_name":"Yuma","last_name":"Graine","email":"ygraine9@tmall.com","password":"4VpkAWyL"},
{"id":11,"first_name":"Quinton","last_name":"Chater","email":"qchatera@squarespace.com","password":"7x6IYp"},
{"id":12,"first_name":"Raymund","last_name":"Moorman","email":"rmoormanb@indiatimes.com","password":"aRgaXm1"},
{"id":13,"first_name":"Boycey","last_name":"Ferrelli","email":"bferrellic@cnet.com","password":"VCKtIJEUi"},
{"id":14,"first_name":"Ty","last_name":"Raffeorty","email":"traffeortyd@cnet.com","password":"wVOd2oi"},
{"id":15,"first_name":"Judie","last_name":"Penella","email":"jpenellae@psu.edu","password":"0WP0F6516"},
{"id":16,"first_name":"Alden","last_name":"Gemlett","email":"agemlettf@independent.co.uk","password":"3rAW4wlTsCWz"},
{"id":17,"first_name":"Josephina","last_name":"MacLeod","email":"jmacleodg@livejournal.com","password":"gQ7ytj7CtA6"},
{"id":18,"first_name":"Lorene","last_name":"Lindeberg","email":"llindebergh@chron.com","password":"Q4WU8aHkm"},
{"id":19,"first_name":"Lamar","last_name":"Sotham","email":"lsothami@rediff.com","password":"5yyhnYPTDs"},
{"id":20,"first_name":"Derek","last_name":"Breakey","email":"dbreakeyj@home.pl","password":"jrz2kl2jeX"}]
Я запускаю эту команду в терминале:
mongoimport --jsonArray --db UTA_Enrollment --collection user --file users.json
Вместо получения всех 20 строк в базе данных я получаю только первую строку, и эти сообщения об ошибках отображаются в командной строке.
2021-02-25T17:47:40.654-0800 connected to: mongodb://localhost/
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 continuing through error: E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
2021-02-25T17:47:40.658-0800 1 document(s) imported successfully. 19 document(s) failed to import.
Я ранее запускал эти строки кода на python и с тех пор удалил две записи, которые прокомментированы, из базы данных.
class User(db.Document):
user_id = db.IntField( unique=True )
first_name = db.StringField( max_length=50 )
last_name = db.StringField( max_length=50 )
email = db.StringField( max_length=30 )
password = db.StringField( max_length=30 )
@app.route("/user")
def user():
# User(user_id=1, first_name="Frank", last_name="Ho", email="frank.ho@uta.com", password="password123").save()
# User(user_id=2, first_name="Mary", last_name="Jane", email="mary.jane@uta.com", password="abc1234").save()
users = User.objects.all()
return render_template("user.html", users=users)
Я понятия не имею, почему это происходит, поскольку идентификатор отличается для каждой записи. Спасибо за помощь
Комментарии:
1.
E11000 duplicate key error collection: UTA_Enrollment.user index: user_id_1 dup key: { user_id: null }
— вы проверили, какой индекс есть вuser_id
поле? Вы можете использоватьdb.collection.getIndexes()
метод вmongo
оболочке, чтобы перечислить все индексы для коллекции. Также см. Уникальные индексы .2. @prasad_ Когда я ввожу db.user.getIndexes(«user_id»), я получаю это обратно
uncaught exception: Error: listIndexes failed: { "ok" : 0, "errmsg" : "no such command: '0'", "code" : 59, "codeName" : "CommandNotFound" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DBCollection.prototype.getIndexes@src/mongo/shell/collection.js:841:15 @(shell):1:1
Ответ №1:
user_id
кажется, есть индекс, который заставляет значения полей быть уникальными
Но в вашем файле users.json нет user_id
поля. Поэтому при импорте данных создается поле с нулевым значением для всех пользователей. И поскольку поле, как должно быть уникальным, у вас есть эта ошибка dup key:
Поэтому, чтобы исправить это, вы должны удалить индекс в поле user_id. Идентификатор документа называется _id
в mongodb
Комментарии:
1. Я совершенно новичок в этой теме. Должен ли я ввести db.collection. Поместите индекс (user) в оболочку mongo db, а затем измените переменную user_id на _id в коде python? Как бы я взял . мне предоставлен файл json с предполагаемым первичным полем в качестве идентификатора, и я использую user_id в качестве имени переменной для интерпретации _id в mongodb в качестве первичного ключа.
2. вы можете удалить индекс с помощью :
db.User.dropIndex("user_id")
. Нет необходимости добавлять_id
в ваш код, это поле объявлено неявно. Для файла Json, я думаю, вам нужно будет переименовать «id» в «_id»3. « { «ok»: 0, «errmsg»: «ns не найден test.User», «code»: 26, «codeName»: «NamespaceNotFound» } ` » это отображается сейчас, когда я ввожу
dropIndex()
метод в оболочку. Также удалите поле user_id и введите тот жеmongoimport
код, что и выше, и все равно получите повторяющиеся ошибки.4. Неважно, если коллекция уже создана, возникнет ошибка. Я исправил это, просто введя
mongoimport
с нуля без создания коллекции пользователей. Спасибо за помощь