查询mongoengine中的预测

时间:2015-10-14 09:00:09

标签: 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(attrib1='xzy') or Q(attrib2='abc')):
    print(json_util.dumps(cur.attrib1))

2 个答案:

答案 0 :(得分:1)

实际上,你错了。

您正在进行查询,其中结果需要包含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')

通过这种方式,resultqueryset,其中包含的结果只包含这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