2012-11-02 40 views
5

Tôi đang sử dụng mongoengine, và tôi đã có những tình huống sau đây,Rắc rối truy vấn ListField với mongoengine

mô hình của tôi:

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

Truy vấn:

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

này trả về một danh sách các bộ chứa tên của thẻ và tần suất. Những gì tôi muốn làm là chỉ nhận được các thẻ có chứa số truy vấn và tần suất tương ứng của chúng. Làm thế nào tôi có thể làm điều đó?

+0

Bạn có thể mô tả mục tiêu cuối cùng/trường hợp sử dụng của truy vấn này cụ thể hơn không? Có một bộ thẻ hữu hạn để chọn không? Bạn chỉ muốn đếm số lượng tài liệu có thẻ chứa truy vấn? tại sao truy vấn item_frequencies ở trên không đủ cho nhu cầu của bạn? –

Trả lời

10

Có mô hình này MongoEngine tương tự và các văn bản:

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

Bạn sẽ lưu trữ này:

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

Trong MongoDB, khi bạn làm một find() nếu các văn bản phù hợp với truy vấn của bạn, những người sẽ được trả lại .

Vì vậy, khi truy vấn sau, bạn sẽ nhận được một mảng tài liệu (đối tượng Bài đăng) có một mongodb trong thẻ mảng. (Trên thực tế các mảng 'tag' được nối với một chuỗi rỗng và phù hợp nếu chứa giá trị 'MongoDB'):

Post.objects(tags__contains='mongodb') 

(filter chỉ là một bí danh của các đối tượng constructor)

Vì vậy, sau khi bạn nhận được hàng tần số, bạn sẽ cần chỉ nhận được những cái bạn quan tâm.

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

> print tag_cloud 
{'mongodb': 2, 'mongoengine': 1} 
> tag_cloud['mongodb'] 
2 
Các vấn đề liên quan