Python mongoengine中的投影查询

Python mongoengine中的投影查询,python,mongodb,mongoengine,Python,Mongodb,Mongoengine,我定义了以下类: class abc(Document) attrib1 = StringField() attrib2 = StringField() attrib3 = StringField() . . attrib30 = StringField() 我只需要将attrib1、attrib2、attrib3作为json输出。如何仅使用文档中的3个属性进行投影 以下是我对一个属性的查询: for cur in abc.objects(Q(a

我定义了以下类:

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'
,但您将返回所有字段(属性)

在修复投影之前,需要将实际查询更正为使用,而不是

要仅指定要从数据库返回的特定字段,需要在中指定该字段

abc.objects(Q(attrib1='xzy')| Q(attrib2='abc'))

在MongoEngine中,您可以仅使用
来执行此操作:

   result = abc.objects(Q(attrib1='xzy') | Q(attrib2='abc')).only('attrib1', 'attrib2', 'attrib3')
通过这种方式,
result
是一个只包含这3个字段的结果。然后你就可以用结果做你想做的事

你在这里做什么:

打印(json_util.dumps(cur.attrib1))

您正在访问每个文档的
attrib1
,并将其打印出来,但实际上所有文档中仍然包含所有字段

from app.models import myCollection
from mongoengine import connect
connect('MyDBName')
# Fetch the data using projection (only)
data = myCollection.objects(key1='val1', timestamp=datetime(2021, 2, 17, 13, 9, 25)).only('field1', 'field2', 'field3')

# then access the data like below:
print("Data length= %d, Type= %s" %(len(data), type(data)))
print("value = ", data[0].field1)
答复如下:

Data length= 366, Type= <class 'flask_mongoengine.BaseQuerySet'>
value = field1_value
数据长度=366,类型=
值=字段1\u值