Python 所以皮达尔+;MongoDB:如何在JSON字段内搜索?
我试图在pyDAL中执行MongoDB的搜索查询: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
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}]}]]