При использовании mongoclient я не могу добавить ключ типа BinData в коллекцию mongo из python - PullRequest
0 голосов
/ 10 октября 2019

когда я запускаю этот запрос в консоли, он работает нормально.

db.testColl.updateMany({},{ "$set": {"__class" : BinData(128, "QXRzXFF1b3RlXE1vZGVsXFF1b3Rl")} })

Но когда я пытаюсь сделать то же самое из программы на Python, он говорит: «BinData не определен»

pythonкод:

import pymongo
from pymongo import MongoClient
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["test"]
mycol = mydb["testColl"]

mycol.update_many({},{ "$set": {"__bclass" : BinData(128, "QXRzXFF1b3RlXE1vZGVsXFF1b3Rl")} })

Я получаю ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'BinData' is not defined

1 Ответ

0 голосов
/ 18 октября 2019

Python-программа сообщает, что «BinData не определен»

Вы видите это сообщение об ошибке, потому что BinData - это утилита оболочки mongo для представления Тип двоичных данных BSON .

В Python это представляется по-разному, используя PyMongo . Если вы используете Python3 , тогда вы можете просто использовать тип байтов Python. Например:

data = b"Ats\\Quote\\Model\\Quote"
collection.update_many({}, {"$set":{"__class": data }})

Это приведет к значению BinData(0, "QXRzXFF1b3RlXE1vZGVsXFF1b3Rl") в коллекции MongoDB.

Если вы используете Python2 , данные должны быть упакованы как экземпляр bson.binary.Binary из модуля bson .

BinData (128, "QXRzXFF1b3RlXE1vZGVsXFF1b3Rl")

Также стоит отметить, что способ построения BinData не является распространенным BSON (хотя у вас может быть особая причина).

BinData принимает параметры в виде BinData(subtype, base64str). Подтип используется для указания того, какие данные находятся в байтовом массиве. В соответствии со спецификацией BSON * общий двоичный подтип равен 0. Это наиболее часто используемый двоичный подтип и должен использоваться по умолчанию для драйверов MongoDB (например, PyMongo) и инструментов.

Хотя подтипы от нуля до 127 предопределены или зарезервированы, подтипы от 128 до 255 определяются пользователем. Если вы специально не указали 128 для определения своего собственного типа, я бы предложил использовать 0.

...