2014-01-14 101 views
6

我正在建造一个使用瓶框架和mongoengine的餐馆预订网站。mongoengine参考字段查询

我的主要目标是当我尝试触发此查询JSON给我一个错误,以获取所有保留的对象,其客户的ID等于想要的客户ID使用JSON

data = rzv.objects(restaurant=rest, customer=cdb.objects.get(id=request.args.get("customer-reservation"))).all() 

mongoengine.errors.InvalidQueryError 

我的预订型号如下:

class Reservations(document.Document): 
    restaurant = fields.ReferenceField(Restaurant) 
    customer = fields.ReferenceField(Customers) 
    shift_type = fields.EmbeddedDocumentField(Shifts) 
    room = fields.ReferenceField(Rooms) 
    time = fields.StringField() 
    covers = fields.IntField() 
    status = fields.StringField(default="wait") 
    desk = fields.EmbeddedDocumentField(Desks) 
    date = fields.DateTimeField() 
    sit_date = fields.DateTimeField() 
    end_sit_date = fields.DateTimeField() 
    cancel_date = fields.DateTimeField() 

我的客户model:

class Customers(document.Document): 
    title = fields.StringField() 
    full_name = fields.StringField() 
    first_name = fields.StringField() 
    last_name = fields.StringField() 
    telephone = fields.StringField() 
    visits = fields.StringField() 

JSON:

$.getJSON("?customer-reservation=" + $(this).attr("data-id"), function (data) { 
      console.log(data); 
      reservationFill(data); 
     }); 

最后认为:

if request.args.get("customer-reservation"): 
     data = rzv.objects(restaurant=rest, customer=cdb.objects.get(id=request.args.get("customer-reservation"))).all() 
     return data 

什么是查询这种情况下,正确的方式。我必须使用过滤器吗?

回答

4

你应该将查询:

customer = Customers.objects(id=request.args.get("customer-reservation")).get() 
data = Reservations.objects(restaurant=rest, customer=customer).all() 

你也将需要错误处理的不符合任何客户。

+0

这会不会是一个性能瓶颈?这看起来像我们需要查询(然后返回)客户的所有字段,然后查询(并返回)所有数据字段。 – benjaminz

+0

对数据库的多次调用,您应该总是通过仅投影所需字段来最小化传输的数据量。您还可以限制返回的数据,以进一步降低网络成本。这取决于您的业务逻辑和要求。至于成为瓶颈 - 这取决于整个堆栈 – Ross

0

您可以使用 - 值列表在单行(应提供值的列表):

data = Reservations.objects(restaurant=rest, 
       customer__in=Customers.objects.filter(id="your filter id")).all()