如何使用'LIKE'语句过滤mongoengine中的对象?

时间:2016-10-17 15:41:00

标签: django mongodb mongoengine

我的mongodb中有以下json结构。

{

    "country": "spain",
    "language": "spanish",
    "words": [
        {
            "word": "hello1",
             ....
         },
         {
            "word": "hello2",
             ....
         },
          {
            "word": "test",
             ....
         },
       ]
}

我试图将所有字典放在'words'列表中,这些字典中有特定的子字符串匹配。

例如,如果我有一个子字符串'hel',那么我应该如何使用mongoengine查询我的文档,该mongoengine给出两个带有单词的字典:'hello1'和'hello2'

以下查询仅适用于不与子字符串匹配的单词。

 data = Data.objects.filter(words__match={"word":"hel"})
    // data is empty in this case([])

1 个答案:

答案 0 :(得分:1)

使用$elemMatch(mongoengine中的match)将从数组中返回与条件匹配的第一个元素。

您需要使用聚合来返回数组中所有匹配的元素:

pipeline = [
    { "$unwind": "$words" },
    { "$match": {"words.word": {"$regex": "hel"} } },
    { "$project": {"word":"$words.word", "_id":0} },
]

Article.objects.aggregate(*pipeline)

结果:

{u'word': u'hello1'}
{u'word': u'hello2'}

注意,使用此项目阶段,您需要提前知道所有字段,以便在投影中指定它们以返回它们。

你也可以将这个项目用于不同的输出,返回所有字段,但包含在'words dict'中:

pipeline = [
    { "$unwind": "$words" },
    { "$match": {"words.word": {"$regex": "hel"} } },
    { "$project": {"words":1, "_id":0} },
]

结果:

{u'words': {u'otherfield': 1.0, u'word': u'hello1'}}
{u'words': {u'otherfield': 1.0, u'word': u'hello2'}}