mongoengine 参考字段查询

Posted

技术标签:

【中文标题】mongoengine 参考字段查询【英文标题】:mongoengine reference field query 【发布时间】:2014-02-03 04:14:48 【问题描述】:

我正在使用烧瓶框架和 mongoengine 为餐厅建立一个预订网站。

我的主要目标是使用 json 获取客户 ID 等于所需客户 ID 的所有预订对象

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

当我尝试触发这个查询时,json 给了我一个错误:

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()

我的客户模型如下:

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

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

【问题讨论】:

【参考方案1】:

您应该拆分查询:

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

您还需要对任何不匹配的客户进行错误处理。

【讨论】:

这会是性能瓶颈吗?这看起来我们需要查询(然后返回)客户的所有字段,然后查询(并返回)所有数据字段。 它对数据库的多次调用,您应该始终通过仅投影您需要的字段来最小化传输的数据量。您还可以限制返回的数据以进一步降低网络成本。这取决于您的业务逻辑和要求。至于成为瓶颈 - 这取决于整个堆栈【参考方案2】:

您可以在一行中使用 in – value is in list(应提供值的列表):

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

【讨论】:

不错的解决方案帮助了我!

以上是关于mongoengine 参考字段查询的主要内容,如果未能解决你的问题,请参考以下文章

Mongoengine:查询 MapField

Mongoengine:查询 MapField

MongoDB:运行更快的查询,这更好 Pymongo 或 MongoEngine

如何在mongoengine中找出字段的类型

Mongoengine 是不是公开了 $min、$max 字段运算符?

使用 mongoengine 编写一个空的 dict 字段