У меня проблемы с импортом данных в mongodb с. У меня есть test.json
файл вроде этого:mongoimport, несовместимый с «Поле _id нельзя изменить с»
{"_id":{"s":{"$numberLong":"38851448"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38853194"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38760498"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"39099662"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38855558"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38760487"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38760488"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"39099663"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38851450"},"a":5},"someKey":"someValue"}
{"_id":{"s":{"$numberLong":"38853546"},"a":5},"someKey":"someValue"}
я пытаюсь импортировать его с помощью следующей команды:
mongoimport --type json --db test --collection coll --file test.json --upsert
импорт терпит неудачу почти всегда с тем же сообщением об ошибке:
2015-08-27T17:02:15.510+0200 error inserting documents: The _id field cannot be changed from {_id: { s: 38851448, a: 5 }} to {_id: { a: 5, s: 38851448 }}.
2015-08-27T17:02:15.511+0200 error inserting documents: The _id field cannot be changed from {_id: { a: 5, s: 38760487 }} to {_id: { s: 38760487, a: 5 }}.
Это разочарование в том, что эта ошибка даже не воспроизводится. Импортёр, похоже, меняет порядок свойств для _id
, но я не знаю, почему, это BUG, о котором следует сообщить или уже известно? Или есть проблема, которую я не вижу.
Я даже попытался изменить порядок s
и a
в _id
, но проблема остается неизменной.
Если я TRIE запустить ту же самую команду импорта с точно такими же файлов данных несколько раз документы с ошибками меняются и одно время импортируемого все строки, как и ожидалось, но только один раз:
Для полноты: я использую mongo 3.0.5 в Mac OS X 10.10.5, установленном доморощенным.
UPDATE: Я создал билет с MongoDB-Team: TOOLS-894
UPDATE2:
Я старался не использовать _id, но идентификатор для моего уникального ключа:
{"id":{"s":{"$numberLong":"38851448"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38853194"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38760498"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"39099662"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38855558"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38760487"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38760488"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"39099663"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38851450"},"a":5},"someKey":"someValue"}
{"id":{"s":{"$numberLong":"38853546"},"a":5},"someKey":"someValue"}
и импортируйте это с:
mongoimport --type json --db test --collection coll --file test.json --upsertFields id
Теперь я не получаю никаких ошибок, но после двух импортов у меня есть 15 строк в коллекции вместо 10. Снова из-за порядка свойств в id
.
Похоже, что флаг '--upsert' вызывает эту ошибку, это необходимо в вашем случае. Похоже, что mongo вызывает проблему, когда он пытается обновить данные с помощью составного идентификатора. – cubbuk
yes upsert необходимо, потому что JSON-файл, который я получаю, представляет собой дамп из другой (не MongoDB) системы и содержит новые и обновленные документы, поэтому upsert является обязательным, поскольку без него он не сможет импортировать с помощью E11000 duplicate key error collection' – jigfox