Django EmbeddedDocument列表字段中的mongoengine搜索

Django EmbeddedDocument列表字段中的mongoengine搜索,django,mongodb,mongoengine,Django,Mongodb,Mongoengine,我使用django MongoneEngine来使用mongdb数据库;我有一个关于在这样一个结构中过滤/搜索的问题: class Shop(Document): created = DateTimeField(default=datetime.now,verbose_name='date_created') updated = DateTimeField(default=datetime.now,verbose_name='date_updated') code = StringField(r

我使用django MongoneEngine来使用mongdb数据库;我有一个关于在这样一个结构中过滤/搜索的问题:

class Shop(Document):
created = DateTimeField(default=datetime.now,verbose_name='date_created')
updated = DateTimeField(default=datetime.now,verbose_name='date_updated')
code = StringField(required=True,unique=True)
socialName = StringField(verbose_name='legal_name')
name = StringField(required=True,verbose_name='shop_name')
address = StringField(required=True,verbose_name='shop_address')
gpsLoc = GeoPointField()
apdo = IntField(default=0)
logo = StringField(verbose_name='url_logo')
listGifts = ListField(EmbeddedDocumentField(Gift))
listOffers = ListField(EmbeddedDocumentField(Offer))
def __unicode__(self):
    return u'%s' % (self.name)
@queryset_manager
def objects(doc_cls,queryset):
    return queryset.order_by('-shop_name')


class Gifted(EmbeddedDocument):
    created = DateTimeField(default=datetime.now,verbose_name='date_created')
    gifted = DateTimeField(default=datetime.now,verbose_name='date_gifted')
    shop = ReferenceField(Shop,required=True,verbose_name='shop')
    gift = EmbeddedDocumentField(Gift,required=True,verbose_name='gift')
    def __unicode__(self):
        return u'%s' % (self.gift)
    @queryset_manager
    def objects(doc_cls,queryset):
        return queryset.order_by('-date_gifted')




class UserProfile(EmbeddedDocument):
    created = DateTimeField(default=datetime.now,verbose_name='date_created')
    updated = DateTimeField(default=datetime.now,verbose_name='date_updated')
    birthday = DateTimeField(verbose_name='birthday')
    gender = BooleanField(default=True,verbose_name='is_man')
    rel_status = StringField()
    name = StringField(max_length=50,verbose_name='name')
    phone = StringField(verbose_name='phone')
    points = IntField(default=0,verbose_name='current_points')
    listGifts = ListField(EmbeddedDocumentField(Gifted))
    listOffers = ListField(EmbeddedDocumentField(Discount))
    def __unicode__(self):      return self.name
    @queryset_manager
    def objects(doc_cls,queryset):
        return queryset.order_by('update')



class User(Document):
    username = EmailField(unique=True,max_length=250,min_length=4,required=True)
    password = StringField(max_length=100,required=True)
    created = DateTimeField(default=datetime.now,verbose_name='date_created')
    code = StringField(required=True,unique=True)
    tok_crypt = StringField(verbose_name='token_crypt',required=True)
    expired = DateTimeField(verbose_name='date_expired')
    last_login = DateTimeField(default=datetime.now, verbose_name='date_last_login')
    profile = EmbeddedDocumentField(UserProfile, verbose_name='profile')
    def __unicode__(self):  return self.username
    @queryset_manager
    def objects(doc_cls,queryset):
        return queryset.order_by('username')
如果我想搜索所有从特定商店(shop.code)购买礼品的用户,我如何过滤/搜索而不使用inside for,inside for。。。等等

比如:

listUsers=User.objects(profile.listGifts\uuuu contains=Gifted.objects(shop.code=sCode))


listUsers=User->Profile->List(Gifted->Shop.code=code)

首先,您必须获得具有给定代码的店铺:

shop = Shop.objects(code=code)[0]
然后使用它在用户集合中搜索:

listUsers = User.objects(profile__listGifts__shop=shop)
MongoEngine在列表中搜索的语法很简单:您只需编写查询,就好像
listGifts
不是列表一样,它将查询列表
listGifts
包含给定商店的所有用户

MongoEngine不做的是加入。我的意思是,您不能对多个集合进行单个查询。上面的第一个查询属于
Shop
类集合。
User
类集合的第二个-
UserProfile
Gifted
是同一集合中的嵌入文档