#json #mongodb #mongodump
#json #mongodb #mongodump
Вопрос:
Я пытаюсь создать резервную копию 3 статей из своей базы данных, у меня есть их идентификаторы, но когда я пытаюсь использовать mongodump, я просто не могу написать правильный запрос json. Я получаю либо сообщение об ошибке JSON, либо какое-то загадочное cannot decode objectID into a slice
сообщение.
Вот команда, которую я пытаюсь запустить в данный момент:
mongodump -d 'data' -c 'articles' -q '{"$oid": "5fa0bd32f7d5870029c7d421" }'
Это возвращает ObjectID into a slice
ошибку, которую я действительно не понимаю. Я также пробовал использовать ObjectId, например:
mongodump -d 'data' -c 'articles' -q '{"_id": ObjectId("5fa0bd32f7d5870029c7d421") }'
Но это выдает invalid JSON
ошибку.
Я перепробовал все формы экранирования, экранирования двойных кавычек, экранирования доллара, но, похоже, НИЧЕГО не работает. Я в отчаянии, и я ненавижу mongodb. Самым близким к рабочему решению, которое я смог найти, было следующее:
mongodump -d 'nikkei' -c 'articles' -q '{"_id": "ObjectId(5fa0bd32f7d5870029c7d421)" }'
И я говорю ближайший, потому что это не сработало, команда была запущена, но она вернулась done dumping data.articles (0 documents)
, что означает, если я правильно понял, что статьи не были сохранены.
Каким будет правильный формат запроса? Кстати, я использую mongodump версии r4.2.2.
Комментарии:
1. В какой операционной системе вы работаете? Кроме того, опубликуйте образец документа.
Ответ №1:
У меня есть коллекция с этими 4 документами:
> db.test.find()
{ "_id" : ObjectId("5fab80615397db06f00503c3") }
{ "_id" : ObjectId("5fab80635397db06f00503c4") }
{ "_id" : ObjectId("5fab80645397db06f00503c5") }
{ "_id" : ObjectId("5fab80645397db06f00503c6") }
Я делаю двоичный экспорт, используя mongodump
. Для этого используется MongoDB версии 4.2в ОС Windows.
>> mongodump --db=test --collection=test --query="{ "_id": { "$eq" : { "$oid": "5fab80615397db06f00503c3" } } }"
2020-11-11T11:42:13.705 0530 writing test.test to dumptesttest.bson
2020-11-11T11:42:13.737 0530 done dumping test.test (1 document)
Комментарии:
1. небольшой совет, который я использую, заключается в том, чтобы заключить запрос в одинарные кавычки (
'
), чтобы избежать экранирования внутренних двойных кавычек, например'{"$eq": "something"}'
Ответ №2:
Вот ответ для тех, кто использует Python:
Примечание: в вашей системе должны быть установлены инструменты базы данных mongo
import json
import os
# insert you query here
query = {"$oid": "5fa0bd32f7d5870029c7d421"}
# cast the query to a string
query = json.dumps(query)
# run the mongodump
command = f"mongodump --db my_database --collection my_collection --query '{query}'"
os.system(command)
Ответ №3:
Если ваш запрос предназначен для JSON, попробуйте этот формат.
mongodump -d=nikkei -c=articles -q'{"_id": "ObjectId(5fa0bd32f7d5870029c7d421)" }'
Есть ли что-нибудь еще, что вы могли бы запросить, например, заголовок? Может сделать вещи немного проще.
Я вытащил это из документов MongoDB. Это было довольно далеко вниз по странице, но вот ссылка.
https://docs.mongodb.com/database-tools/mongodump/#usage-in-backup-strategy
Комментарии:
1. Нет, это все еще не работает. Результат есть
done dumping nikkei.articles (0 documents)
, но я проверил идентификатор с помощью mongodb compass, и он действительно существует. Не удалось определить правильный формат, я просто использовал другие поля, которые не являются идентификаторами, такие как название статьи. Я действительно надеюсь, что мне никогда больше не придется работать с MongoDB.