使用 mongoengine 编写一个空的 dict 字段

Posted

技术标签:

【中文标题】使用 mongoengine 编写一个空的 dict 字段【英文标题】:write an empty dict field using mongoengine 【发布时间】:2018-12-15 03:36:36 【问题描述】:

我观察到 document[field] 返回 的 mongo 文档,但我似乎无法创建这样的文档。示例:

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()

【问题讨论】:

这似乎与github.com/MongoEngine/mongoengine/issues/267 有关。我验证了相同的行为适用于列表,而不仅仅是字典。 【参考方案1】:

一个明显的解决方法是在创建文档后对其进行更新,但这感觉就像是一个 hack。如果 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()

【讨论】:

以上是关于使用 mongoengine 编写一个空的 dict 字段的主要内容,如果未能解决你的问题,请参考以下文章

Mongoengine Q 类“或”

MongoEngine:关闭连接

python之编写登陆接口

Python中使用MongoEngine3

Python中使用MongoEngine

mongoengine