我定义了以下类:

class abc(Document)
    attrib1 = StringField()
    attrib2 = StringField()
    attrib3 = StringField()
    .
    .
    attrib30 = StringField()

我只需要得到attrib1, attrib2, attrib3作为json输出。如何使用文档中仅有的3个属性进行投影?
以下是我对一个属性的查询:
for cur in abc.objects(Q(attrib1='xzy') or Q(attrib2='abc')):
    print(json_util.dumps(cur.attrib1))

最佳答案

实际上,你错了。
您正在进行一个查询,其中的结果需要包含attrib1='xyz'attrib2='abc',但您将返回所有字段(属性)。
在修复投影之前,需要更正实际查询以使用bitwise operators而不是andor
要只指定从数据库返回的某些字段,您需要在projection中指定。
abc.objects(Q(attrib1='xzy') | Q(attrib2='abc'))
在Mongoengine中,您可以使用only

   result = abc.objects(Q(attrib1='xzy') | Q(attrib2='abc')).only('attrib1', 'attrib2', 'attrib3')

这样,result就是一个queryset结果,它只包含这三个字段。比你想用结果做什么都好。
你在这里做什么:
print(json_util.dumps(cur.attrib1))
是指您正在访问每个文档的attrib1并打印它,但实际上所有文档中仍有所有字段。

07-24 18:12