I have a list of topics that I want to filter out from ‘title’ field in News Database.
I want the solution to do the opposite of what __contains
does, but contains works with string, and I want to give it a list in which it will filter out every news that will contain the words given in the list.
Example:
blacklist=["Facebook", "Apple"]
I want to use this list and filter out every news if its title contains words in blacklist
.
Edit: I think I didn’t clarify my objective in above lines.
Using blacklist
declared above, in a list of news, exclude all news that ‘contains’ words in blacklist
. (NOTE: I want to solve it using ‘list’ because this list i.e. blacklist
might contain a lot of words.)
e.g. “Facebook is not privacy friendly” = excluded
“Apple may be privacy friendly” = excluded
“Bitcoin market crashed” = not excluded
Advertisement
Answer
You can combine multiple conditions with AND/OR through MongoEngine’s Q class
from mongoengine import connect, Document, StringField, Q connect() class TestDoc(Document): s = StringField() TestDoc(s="Facebook is this").save() TestDoc(s="and Twitter is that").save() TestDoc(s="Something else").save() query = Q(s__contains="Facebook") | Q(s__contains="Twitter") TestDoc.objects(query) # finds the 2 objects # or dynamically from a list... my_fancy_list = ['Facebook', 'Twitter'] dynamic_query = Q(s__contains=my_fancy_list.pop()) while my_fancy_list: dynamic_query |= Q(s__contains=my_fancy_list.pop()) TestDoc.objects(dynamic_query) # finds the 2 objects