Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 所以皮达尔+;MongoDB:如何在JSON字段内搜索?_Python_Json_Mongodb_Web2py_Pydal - Fatal编程技术网

Python 所以皮达尔+;MongoDB:如何在JSON字段内搜索?

Python 所以皮达尔+;MongoDB:如何在JSON字段内搜索?,python,json,mongodb,web2py,pydal,Python,Json,Mongodb,Web2py,Pydal,我试图在pyDAL中执行MongoDB的搜索查询: db.stores.find({ 'menu.items.food.category': 'Pizza' }) 存储到pyDAL表的集合映射为: Store = db.define_table( 'stores', Field('name'), Field('date', type='datetime'), Field('description', type='json'), Field('ad

我试图在pyDAL中执行MongoDB的搜索查询:

db.stores.find({
    'menu.items.food.category': 'Pizza'
})
存储到pyDAL表的集合映射为:

Store = db.define_table(
    'stores',
    Field('name'),
    Field('date', type='datetime'),
    Field('description', type='json'),
    Field('address'),
    Field('featured', type='boolean'),
    Field('lat', type='double'),
    Field('lng', type='double'),
    Field('image'),
    Field('city'),
    Field('menu', type='json'),
    Field('country'),
    Field('category'),
    Field('URI'),
    Field('reviews', type='list:string')
)
我在做:

第一次尝试:

db(Store.menu.items.food.category == 'Pizza').select())
db(Store.menu['items']['food']['category'] == 'Pizza').select()
输出:

输出:

输出:


存储。菜单字段定义为JSON。如何在它们的键中执行查询?

您将JSON视为一个对象,这在JS中是可以的,但在Python中不是。标准Python没有JSON对象的概念——在Python中,JSON只是字典和列表的分层混合体,所以

Store['menu']['items']['food'][0]['category']

将给您“比萨饼”

您将JSON视为一个对象-这在JS中是可以的,但在Python中不是。标准Python没有JSON对象的概念——在Python中,JSON只是字典和列表的分层混合体,所以

Store['menu']['items']['food'][0]['category']

将为您提供“Pizza”

我执行类似操作的唯一方法是首先查找菜单不为空的存储,然后过滤pyDAL映射到dict的JSON字段:

stores = db(Store.menu).select()
results = []

for store in stores:
    results.append(list(filter(lambda food: food['category'] == 'Pizza', store.menu['items']['food'])))

pprint(results)
输出:


我可以执行类似操作的唯一方法是首先查找菜单不为null的存储,然后通过pyDAL筛选映射到dict的JSON字段:

stores = db(Store.menu).select()
results = []

for store in stores:
    results.append(list(filter(lambda food: food['category'] == 'Pizza', store.menu['items']['food'])))

pprint(results)
输出:

pyDAL可以在任何数据库中存储JSON数据,但它没有用于在JSON数据中查询的API,即使对于支持此类操作的数据库也是如此。如果使用支持SQL的数据库(例如Postgres),则可以通过将原始SQL字符串作为查询传递给
DAL
对象,在JSON字段中进行查询。但是,这种方法不适用于MongoDB

对于MongoDB,最好的方法是直接使用pymongo驱动程序进行查询。您可以通过pymongo创建自己的连接,也可以重新使用pyDAL创建的连接,该连接可以在
db.\u adapter.connection
(驱动程序本身可以在
db.\u adapter.driver
)进行访问。

pyDAL可以在任何数据库中存储JSON数据,但它没有用于查询JSON数据的API,即使对于支持此类操作的数据库也是如此。如果使用支持SQL的数据库(例如Postgres),则可以通过将原始SQL字符串作为查询传递给
DAL
对象,在JSON字段中进行查询。但是,这种方法不适用于MongoDB


对于MongoDB,最好的方法是直接使用pymongo驱动程序进行查询。您可以通过pymongo创建自己的连接,或者重新使用pyDAL创建的连接,该连接可以在
db.\u adapter.connection
(驱动程序本身可以在
db.\u adapter.driver
)进行访问。

如果我试图访问db.stores.find({})返回的值,这是正确的。这里的问题是以pyDAL格式进行此查询:db.stores.find({'menu.items.food.category':'Pizza'}),如果我试图访问db.stores.find({})返回的值,则此查询是正确的。这里的问题是以pyDAL格式进行此查询:db.stores.find({'menu.items.food.category':'Pizza'))是的,我在调试db对象并在您对其进行评论之前就发现了它。lol。无论如何,谢谢,您确认了我的怀疑!是的,在你评论db对象之前,我就知道了调试db对象会变得疯狂,哈哈。无论如何,谢谢你,你证实了我的怀疑!
Store['menu']['items']['food'][0]['category']
stores = db(Store.menu).select()
results = []

for store in stores:
    results.append(list(filter(lambda food: food['category'] == 'Pizza', store.menu['items']['food'])))

pprint(results)
[[{'_id': ObjectId('5aa06d7784b554537f888858'),
   'category': 'Pizza',
   'date': datetime.datetime(2018, 3, 6, 2, 21, 4, 958000),
   'name': {'en': 'Mozzarella pizza',
            'es': 'Pizza Mozzarella',
            'it': 'Pizza alla Mozzarella'},
   'paymentMethods': ['Cash', 'Credit Card'],
   'picture': 'http://cdn.appicar.com/stores/menu/ZPoYEMmanZgmFvYpC/5aa06d7784b554537f888858.jpg',
   'price': [{'currency': 'ARS', 'value': 150.0}]}],
 [{'_id': ObjectId('5aa06c7a84b554537f888855'),
   'category': 'Pizza',
   'date': datetime.datetime(2018, 3, 7, 22, 49, 30, 118000),
   'name': {'en': 'Mozzarella Pizza',
            'es': 'Pizza Mozzarella',
            'it': 'Pizza alla Mozzarella'},
   'paymentMethods': ['Cash', 'Credit Card'],
   'picture': 'http://cdn.appicar.com/stores/menu/5kPxqXmRw6yyjfRLb/5aa06c7a84b554537f888855.jpg',
   'price': [{'currency': 'ARS', 'value': 120.0}]}]]