Search code examples
python-3.xmongodbmongoengineflask-mongoengine

MongoEngine: Operator "__contains" does not work with non-english letters or words


When trying to use Q(nickname__contains="") from mongoengine.queryset.visitor, mongoengine will not match the non-english character.

For instance:

{

"nickname":"你好啊"

}

=> User.objects(Q(nickname__contains="你好")).first()

=> None

But with English letters, this will work:

{

"nickname":"Hello"

}

=> User.objects(Q(nickname__contains="Hel")).first()

=> (User Object)


Solution

  • I don't seem to have the issue, at least with recent version of mongoengine (tested with 0.16.3).

    Note that you can also use the __raw__ parameter in .objects to issue a raw pymongo query

    See below:

    class TestUser(Document):
        nickname = StringField()
    
    TestUser(nickname="你好啊").save()
    
    TestUser.objects(nickname__contains="你好").first()  # prints <TestUser: TestUser object>
    
    TestUser.objects(__raw__={"nickname" : {"$regex" : ".*你好.*"}}).first() # prints <TestUser: TestUser object>