我正在尝试添加字典列表(名称为stanzanerlist
),如下所示:
stanzanerlist = [{
"text": "Harry Potter",
"type": "PER",
"start_char": 141,
"end_char": 153
}, {
"text": "Hogwarts",
"type": "LOC",
"start_char": 405,
"end_char": 413
}, {
"text": "JK Rowling",
"type": "PER",
"start_char": 505,
"end_char": 515
}]
作为集合中MongoDB文档的字段。
我将按如下所示插入整个文档,并将stanzanerlist
作为mongodocument
中的最后一项:
mongodocument = {
"_id": urlid,
"source": sourcename,
"stanzadoc": stanzadoc.to_serialized(),
"stanzaver": stanzaver,
# "timestamp": datetime.now(tzinfo),
"timestamp": datetime.now(
tz=pytz.timezone(cfgdata["timezone"]["name"])
),
"stanzanerlist": stanzanerlist,
}
try:
mdbrc = mdbcoll.insert_one(
mongodocument
) # insert fails if URL/_ID already exists
return mdbrc
except pymongo.errors.DuplicateKeyError:
# manage the record update
print(f"Article {urlid} already exists!")
但是,尽管所有其他字段都工作良好,添加stanzanerlist
会产生以下误差:
cannot encode object: {
"text": "Harry Potter",
"type": "PER",
"start_char": 141,
"end_char": 153
}, of type: <class 'stanza.models.common.doc.Span'>
我不明白我是否以及怎样才能实现这个加法。
1条答案
按热度按时间toe950271#
pymongo
本身不知道如何将<class 'stanza.models.common.doc.Span'>
类型转换为可接受的BSON数据类型。你可以 “教”
pymongo
如何使用定制的bson.codec_options.TypeEncoder
进行正确的转换/编码,然后pymongo
会自动执行类型转换,就像它对其他类型所做的那样。或者,你可以在每次将Span
存储到MongoDB集合之前自己进行转换/编码。幸运的是,斯坦福大学NLP Stanza有一些方便的类型转换方法。
<class 'stanza.models.common.doc.Span'>
有一个to_dict
方法,可以将类型转换为Dict
类型,pymongo
知道如何编码。因此,在代码片段中,可以将
"stanzanerlist"
的mongodocument
赋值更改为:......然后每个
<class 'stanza.models.common.doc.Span'>
将被转换为一个Dict
,并且pymongo
应该能够存储它。