Sie können schweigen dieses Verhalten durch Beispiel mit dem folgenden Befehl starten mongod:
mongod --setParameter failIndexKeyTooLong=false
oder durch die Ausführung folgender Befehl von mongoShell
db.getSiblingDB('admin').runCommand({ setParameter: 1, failIndexKeyTooLong: false })
Wenn Sie sichergestellt haben, dass Ihr Feld den Grenzwert sehr selten überschreitet, dann ist eine Möglichkeit, dieses Problem zu lösen, indem Sie Ihr Feld (das den Index außerhalb des Grenzwerts verursacht) in byteweise Teile aufteilen < 1KB z. für Feld val
würde ich es in Tupel von Feldern val_1
, val_2
und so weiter aufteilen. Mongo speichert Text als utf-8 gültige Werte. Das bedeutet, dass Sie eine Funktion benötigen, die UTF-8-Strings richtig aufteilen kann.
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
Dann können Sie Ihre Verbindung Index definieren:
db.coll.ensureIndex({val_1: 1, val_2: 1, ...}, {background: true})
oder mehrere Indizes für jeden 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})
Wichtig: Wenn Sie Ihr Feld in Verbindung Index in Betracht ziehen, dann sei vorsichtig mit dem zweiten Argument für split_utf8
Funktion. Bei jedem Dokument müssen Sie die Summe der Bytes jedes Feldwerts entfernen, die Ihren Indexschlüssel enthalten, z. für den Index (a: 1, b: 1, Val: 1) 1024 - sizeof(value(a)) - sizeof(value(b))
In allen anderen Fällen verwenden entweder hash oder text Indizes.
Sie versuchen, Index für "Modul" zu löschen. Ich denke, dein Inhalt ist zu groß für den normalen Index. – NHK