2012-11-02 12 views
5

sto usando mongoengine, e ho ottenuto la seguente situazione,Problemi interrogazione ListField con mongoengine

Il mio modello:

class Item(Document): 
    ... 
    tags = ListField(StringField(max_length=30)) 

La query:

filters = { 
    'tags__contains': query 
} 
tags_with_counter = Item.objects.filter(**filters).item_frequencies('tags') 

Questo restituisce una elenco di tuple contenenti il ​​nome del tag e la frequenza. Quello che voglio fare è ottenere solo i tag che contengono query e la loro frequenza rispettiva. Come lo posso fare?

+0

Puoi descrivere l'obiettivo finale/caso d'uso di questa query in modo più dettagliato? C'è un set finito di tag tra cui scegliere? Vuoi solo il conteggio dei documenti con tag contenenti query? perché la suddetta query item_frequencies non è sufficiente per le tue esigenze? –

risposta

10

avere questo simile modello MongoEngine e documenti:

class Post(Document): 
    title = StringField() 
    tags = ListField(StringField()) 

post1 = Post(title='Fun with MongoEngine', tags=['mongodb', 'mongoengine']).save() 
post2 = Post(title='Loving Mongo', tags=['mongodb']).save() 

Potrai memorizzare questo:

{ 
    "tags": [ "mongodb", "mongoengine" ], 
    "title": "Fun with MongoEngine" 
} 
{ 
    "tags": [ "mongodb" ], 
    "title": "Loving Mongo" 
} 

In MongoDB, quando si esegue una find() se i documenti corrisponde alla tua ricerca, quelli saranno restituiti .

Quindi, quando la query seguente, otterrete una serie di documenti (oggetti Post) che hanno un mongodb nel tag matrice. (In realtà l'array 'tag' è unita con una stringa vuota e abbinati se contiene il valore 'MongoDB'):

Post.objects(tags__contains='mongodb') 

(filter è solo un alias di oggetti costruttore)

Così, dopo che ottenete l'articolo frequenze, dovrai solo ottenere quelli che ti interessano.

tag_cloud = Post.objects(tags__contains='mongodb').item_frequencies('tags') 

> print tag_cloud 
{'mongodb': 2, 'mongoengine': 1} 
> tag_cloud['mongodb'] 
2 
Problemi correlati