我的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([])
答案 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'}}