Djnago / djongo Mongo db-də unikal indeks yaratdıqdan sonra necə köçmək olar

Unsplash-də Faisal M-in şəkli

Server inkişafım üçün Django / djongo / mongodb / drf yığını istifadə edirəm. server özü mərkəzləşdirilmiş tarama meneceri olduğundan, çox sayda tarama instansiyası tarama xəbərləri ardıcıllıqla saxlaya bilər.

Xüsusi münasibətimdə bu xüsusi problemlə qarşılaşıram. Unikal konfiqurasiya olunmayan məqalə_url adlı bir model təyin etdim. və məqalə_url üçün ziddiyyət olmaması üçün təsdiqləyicini əlavə etdi. (drf serializer-də) doğrulayıcı baha başa gəldiyindən və kütləvi məlumatlarla işləyirəm, verilənlər bazasının qatında bunun qarşısını almağa ehtiyacım var

orijinal modelim bənzəyirdi,

djongo idxal modellərindən
sinif RawNews (modellər.Model): sinif Meta: db_table = 'xam' _id = modellər.ObjectIdField () vaxt = modellər.DateTimeField () başlıq = modellər. body_html = modellər.TextField ()

dəyişdikdən sonra (unikal əlavə edildi = sahəyə məqalə_url üçün doğrudur)

djongo idxal modellərindən
sinif RawNews (modellər.Model): sinif Meta: db_table = 'xam' _id = modellər.ObjectIdField () vaxt = modellər.DateTimeField () başlıq = modellər. unikal = Həqiqi) bədən_html = modellər.TextField ()

sonra,

python management.py makemigrations -> həmişəki kimi yaxşı işləyir

python management.py köç ->

Pymongo xətası: {'ok': 0.0, 'errmsg': 'E11000 dublikat açar səhvi toplusu: db.raw index: raw_article_url_uniq dup açarı: {Article_url: "https: // ~…

Bunu həll etmək üçün əl ilə unikal etmək istədiyiniz açar üçün ziddiyyəti aradan qaldırmalı və yenidən köçürməli olacaqsınız.

Bunun üçün gedək!

TL; DR

  • mongodb kolleksiyasında bənzərsiz yeni indeks yaratmaq üçün necə
  • bənzərsiz indeks səhvsiz yaradıla bilməsi üçün ziddiyyət məlumatlarını necə çıxarmaq olar.
  • nəhayət, django / djongo / mongodb layihəsini yeni model nadir sahə ilə necə köçürmək olar

mongodb kolleksiyasında bənzərsiz yeni indeks yaratmaq üçün necə

db.raw.ensureIndex ({məqalə_url: 1}, {unikal: əsl, dropDups: əsl})

yuxarıdakı əmr yalnız mongodb 2.X istifadə edirsinizsə işləməlidir

mongodb 3.X istifadə edirsinizsə, aşağıdakı mesajı alacaqsınız.

{"ok": 0, "errmsg": "E11000 dublikat açar səhv toplusu: db.raw index: Article_url_1 dup düyməsi: {Article_url:" https: // ~~~ "}", "code": 11000, "codeName ":" DuplicateKey "," keyPattern ": {" article_url ": 1}," keyValue ": {" Article_url ":" https: // ~~~ "}}
Mongodb 3.X dropDups (açılan dublikatlar) köhnəldiyindən və nəzərə alınmır.

rəsmi sənədin tamam olduğunu söylədi / amma olmadı (sənəd 2020.2-dən bəri yenilənməmişdir). buna görə yuxarıdakı əmr köhnəlmiş olacaq və yazmalı olacaqsınız

db.raw.ensureIndex ({məqalə_url: 1}, {unikal: əsl})

yenə də eyni səhv alacaqsınız, unikal indekslər yaratmaq üçün əvvəlcə münaqişə düymələrini əl ilə silməlisiniz. (aşağıda izləyin)

ziddiyyətli məlumatları necə çıxarmaq olar ki, səhvsiz səhv indeks yaransın.

db.raw.find ({}, {məqalə_url: 1}). sıralayın məqalə_url: doc.article_url});})

bu əməliyyat kolleksiyanızın ölçüsündən asılı olaraq bir müddət çəkə bilər. bu addım rəqabət etdikdə, indi açar üçün unikal indeks yarada bilərsiniz (yenidən bölmə yuxarıda əmr ver)

misc :: əlavə əmrlər

// siyahı 'xam' toplanması üçün yaradılan indeks - bu db.raw.getIndexes () əvəz edin
// indeks adı ilə yaradılan indeksdən silin (yuxarıdakı əmrlə sadalaya bilərsiniz) db.raw.dropIndex ( )

İstinadlar

https://docs.mongodb.com/manual/tutorial/manage-indexes/