Как написать правильный запрос mongodb для mongodump?

#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.