Można milczeć to zachowanie poprzez uruchomienie mongod instancję za pomocą następującego polecenia:
mongod --setParameter failIndexKeyTooLong=false
lub przez wykonanie następujące polecenie od mongoShell
db.getSiblingDB('admin').runCommand({ setParameter: 1, failIndexKeyTooLong: false })
Jeśli upewniłeś się, że twoje pole przekroczy limit bardzo rzadko, to jednym ze sposobów rozwiązania tego problemu jest podzielenie twojego pola (które powoduje indeks poza limit) na części według długości bajtowej < 1KB np. dla pola val
podzieliłbym go na krotkę pól val_1
, val_2
i tak dalej. Mongo przechowuje tekst jako prawidłowe wartości UTF-8. Oznacza to, że potrzebujesz funkcji, która poprawnie rozdzieli ciągi utf-8.
def split_utf8(s, n):
"""
(ord(s[k]) & 0xc0) == 0x80 - checks whether it is continuation byte (actual part of the string) or jsut header indicates how many bytes there are in multi-byte sequence
An interesting aside by the way. You can classify bytes in a UTF-8 stream as follows:
With the high bit set to 0, it's a single byte value.
With the two high bits set to 10, it's a continuation byte.
Otherwise, it's the first byte of a multi-byte sequence and the number of leading 1 bits indicates how many bytes there are in total for this sequence (110... means two bytes, 1110... means three bytes, etc).
"""
s = s.encode('utf-8')
while len(s) > n:
k = n
while (ord(s[k]) & 0xc0) == 0x80:
k -= 1
yield s[:k]
s = s[k:]
yield s
Następnie można zdefiniować indeks złożonych:
db.coll.ensureIndex({val_1: 1, val_2: 1, ...}, {background: true})
lub wiele indeksów za każdym val_i
:
db.coll.ensureIndex({val_1: 1}, {background: true})
db.coll.ensureIndex({val_1: 2}, {background: true})
...
db.coll.ensureIndex({val_1: i}, {background: true})
Ważne: jeśli wziąć pod uwagę przy użyciu pola indeksu złożonego następnie uważaj na drugi argument funkcji split_utf8
. Przy każdym dokumencie musisz usunąć sumę bajtów każdej wartości pola, która zawiera twój klucz indeksu, np. dla wskaźnika (A 1, B 1, Val: 1) 1024 - sizeof(value(a)) - sizeof(value(b))
W innych przypadkach używać zarówno hash lub text indeksów.
Próbujesz usunąć indeks dla "Module". Myślę, że Twoje treści są za duże, by wyświetlać zwykły indeks. – NHK