написать пустое поле dict, используя mongoengine - PullRequest
0 голосов
/ 06 июля 2018

Я наблюдал монго-документы, для которых document[field] возвращает {}, но я не могу создать такой документ. Пример:

import mongoengine

mongoengine.connect('FOO', host='localhost', port=27017)

class Foo(mongoengine.Document):
    some_dict = mongoengine.DictField()
    message = mongoengine.StringField()

ID = '59b97ec7c5d65e0c4740b886'
foo = Foo()
foo.some_dict = {}
foo.id = ID
foo.save()

Но когда я запрашиваю запись, some_dict отсутствует среди полей, поэтому последняя строка выдает ошибку:

import pymongo
CON = pymongo.MongoClient('localhost',27017)
x = CON.FOO.foo.find_one()
assert str(x['_id']) == ID
assert 'some_dict' in x.keys()

1 Ответ

0 голосов
/ 06 июля 2018

Один очевидный обходной путь - обновить документ после его создания, но это выглядит как слишком много взлома. Я бы предпочел, чтобы mongoengine позволял делать это напрямую:

import mongoengine
import pymongo
CON = pymongo.MongoClient('localhost',27017)
CON.Foo.foo.remove()

mongoengine.connect('FOO', host='localhost', port=27017)

class Foo(mongoengine.Document):
    some_dict = mongoengine.DictField()
    some_list = mongoengine.ListField()

ID = '59b97ec7c5d65e0c4740b886'
foo = Foo()
foo.id = ID
foo.save()

from bson.objectid import ObjectId
CON.FOO.foo.update_one({'_id': ObjectId(ID)},
                       {'$set': {'some_dict': {}}}, upsert=False)

x = CON.FOO.foo.find_one()
assert str(x['_id']) == ID
assert 'some_dict' in x.keys()
...