如何使用python在dict中包含的嵌套dicts或数组中使用mongoengine执行此类过滤查询?

Rol*_*ndo 5 python mongodb

假设我有以下dict对象:

{
    "a": "value of a",
    "somedict": {
        "someinfo": [
            {
                "name": "Jordan",
                "food": [
                    "fries",
                    "coke",
                    "drink"
                ]
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想使用mongoengine在python中应用查询过滤器,我该怎么办?我在文档中看到你可以做的事情:

sample_objs_filter = Sample.objects(a='value of a')
Run Code Online (Sandbox Code Playgroud)

但我怎么过滤说

1) "name='Jordan'" 
2)'food' contains 'fries'?
Run Code Online (Sandbox Code Playgroud)

如果mongoengine不能这样做,是否有其他mongo库更好地完成这个?

Ros*_*oss 11

我建议阅读更多关于mongodb的点符号,了解如何查询/查看对象并返回匹配的文档.

因为你不能使用点作为关键字参数mongoengine遵循双下划线的django orm风格:

1) Sample.objects(somedict__someinfo__name='Jordan')
2) Sample.objects(somedict__someinfo__food='Fries')
Run Code Online (Sandbox Code Playgroud)


小智 5

所述mongoengine点表示法可以mongoengine内以下面的方式被使用:Sample.objects(__raw__=“ name_of_db_field‘:’value_to_match”)

说你的班级是:

Class data(Document):
   field = DictField(db_field="dbfield")
Run Code Online (Sandbox Code Playgroud)

你存储字典:

{
    "a": "value of a",
    "somedict": {
        "someinfo": [
            {
                "name": "Jordan",
                "food": [
                    "fries",
                    "coke",
                    "drink"
                ]
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

键充当对象属性,因此可以这样查询:

data.objects(field__a = "value of a")
Run Code Online (Sandbox Code Playgroud)

读作一样

data.objects(__raw__ = {'dbfield.a' : 'value of a'})
Run Code Online (Sandbox Code Playgroud)

对于嵌套项目,__作为点工作。例子

data.objects(field__somedict__someinfo__name="Jordan")
Run Code Online (Sandbox Code Playgroud)

读作相同:

data.objects(__raw__ = {'dbfield.somedict.someinfo.name' : 'Jordan'})
Run Code Online (Sandbox Code Playgroud)