У меня есть фрагмент кода Python, который использует библиотеку PyMongo для вставки в мою коллекцию mongodb, размещенную в MongoDB Atlas.
Я пытаюсь вставить следующий документ в коллекцию под названием Customer, развернутую в Atlas, с помощью вызова Insert_many().
{'Source': ['LoanDelivery_2022-03-31'], 'CustID': 1, 'CustName': 'Seexxx', 'CustPhone': '940xxxxx', '_id': ObjectId('66ca8d5873a3fdxxxx')}
Схема сбора следующая.
{
$jsonSchema: {
title: 'Customers_Schema',
properties: {
CustID: {
bsonType: 'int'
},
CustName: {
bsonType: 'string'
},
CustPhone: {
bsonType: 'string'
},
CustAddress: {
bsonType: 'string'
},
Source: {
bsonType: [
'string'
],
description: 'Sources of the record'
}
},
required: [
'CustID',
'CustName',
'Source'
]
}
}
Я получаю сообщение об ошибке, в котором говорится, что рассматриваемый тип источника является массивом, а ожидаемый тип — ['строка']. Разве эти два типа не эквивалентны, и Pymongo должен автоматически выполнить двоичное преобразование? Есть ли какое-либо преобразование типов, которое мне нужно выполнить в моем коде Python, прежде чем я напишу в MongoDB?
Вот фрагмент объекта BulkWriteError, созданного операцией записи.
{'operatorName': 'bsonType', 'specifiedAs': {'bsonType': [...]}, 'reason': 'type did not match', 'consideredValue': ['LoanDelivery_2022-03-31'], 'consideredType': 'array'}
special variables
function variables
'operatorName' =
'bsonType'
'specifiedAs' =
{'bsonType': ['string']}
'reason' =
'type did not match'
'consideredValue' =
['LoanDelivery_2022-03-31']
'consideredType' =
'array'
спасибо, это полезно... кроме того, я также получал ошибку несоответствия типов в моем поле CustID, потому что схема изначально была определена с длинным типом в схеме проверки в Mongo DB для этой коллекции. Это несмотря на явное приведение к типу Python int перед записью в Mongo DB. Сейчас я вернул это значение в схему к int, но было бы здорово, если бы у вас были какие-нибудь подсказки о том, как работать с атрибутами bson длинного типа ((int64)) в схеме.
см. mongodb.com/docs/manual/reference/operator/query/jsonSchema/…, поддерживается long

Проблема в том, что в описании схемы тип может быть указан как массив. то есть bsonType: 'string' и bsonType: ['string'] одинаковы.
Исправленная схема следующая:
{
$jsonSchema: {
title: 'Customers_Schema',
properties: {
CustID: {
bsonType: 'int'
},
CustName: {
bsonType: 'string'
},
CustPhone: {
bsonType: 'string'
},
CustAddress: {
bsonType: 'string'
},
Source: {
bsonType: [
'array'
],
description: 'Sources of the record',
minItems: 1,
items: {
bsonType: ['string']
}
}
},
required: [
'CustID',
'CustName',
'Source'
]
}
}
Повторяю комментарий выше, если вы можете помочь. Спасибо, это полезно... кроме того, я также получал ошибку несоответствия типов в моем поле CustID, потому что схема изначально была определена с длинным типом в схеме проверки в Mongo DB для этой коллекции. И это несмотря на явное приведение к типу Python int перед записью в Mongo DB. Теперь я вернул этот атрибут в схему на int, но было бы здорово, если бы у вас были какие-нибудь указания о том, как работать с атрибутами bson длинного типа ((int64)) в схеме, не получая несоответствия типов int и long.
массив должен быть указан по-другому, см. пример по этой ссылке mongodb.com/blog/post/…