我定义了以下类:
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))
答案 0 :(得分:1)
实际上,你错了。
您正在进行查询,其中结果需要包含attrib1='xyz'
或attrib2='abc'
,但您要返回所有字段(属性)。
在您修改投影之前,需要更正实际查询以使用bitwise operators而不是and
或or
。
要仅指定要从数据库返回的某些字段,您需要在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
,其中包含的结果只包含这3个字段。你可以用你的结果做你想做的事。
你在这做什么:
print(json_util.dumps(cur.attrib1))
,
是您正在访问每个文档的attrib1
并打印它,但实际上所有文档仍然包含所有文档。
答案 1 :(得分:0)
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