2014-01-14 148 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()