mongoengine - Query on ListField of EmbeddedDocume

2019-01-20 17:15发布

问题:

I use mongoengine with Django and python.

This is my code:

class Chambre(EmbeddedDocument):
    max_personne = IntField(default=0)
    prix = IntField(default=0)

class Hotel(Document):
    code = IntField(default=0)
    nom = StringField(max_length=200)
    chambre = ListField(EmbeddedDocumentField(Chambre))
    resume = StringField(max_length=200)

1 - I want a query to filter all Hotel that have at least a Chambre with prix >= a (a floeat number)

2 - also have that Chambre

Any idea?

回答1:

You can use the embedded notation as well as the Query Operator for "greater than or equal "

Hotel.objects(chambre__prix__gte=a)

Or if you need to cast as an integer:

Hotel.objects(chambre__prix__gte=int(math.floor(a)))

If you want to only project the "matched" element, use a raw query directly on the driver instead:

Hotel._get_collection().find(
  { 'chambre.prix': { '$gte': int(math.floor(a)) } },
  { 'chambre.$': 1 }
)