PyMongo:使用 json 和列表进行查询
PyMongo: querying using json with a list
如果我有这样的 json:
query = {
"canonical.operatingSystemFamily": "Linux",
"canonical.region": "us-east-1"
}
我可以将它直接传递给 find 并且它有效:
self._db_conn[collection_name].find(query)
我也想这样做,但要使用列表,例如:
query = {
"canonical.operatingSystemFamily": ["Linux","Windows"],
"canonical.region": ["us-east-1", "us-east-2"]
}
有办法吗?我知道“$in”,但我不想解析我的查询数据。这是一个非常简化的例子,有很多字段可能存在也可能不存在。有没有办法直接将 json 与列表一起使用?
它不是一个解析器 - 只是检查 type
。
$ ipython
Python 3.8.10 (default, May 4 2021, 00:00:00)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.1.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: query = {
...: "canonical.operatingSystemFamily": ["Linux","Windows"],
...: "canonical.region": ["us-east-1", "us-east-2"]
...: }
In [2]: for k,v in query.items():
...: if type(v)==list:
...: query[k]={"$in": v}
...:
In [3]: query
Out[3]:
{'canonical.operatingSystemFamily': {'$in': ['Linux', 'Windows']},
'canonical.region': {'$in': ['us-east-1', 'us-east-2']}}
如果需要,您可以定义一个函数来在出现 list
时转换 query
。
from copy import deepcopy
def query_lfixer(query, copy=True):
if copy:
query = deepcopy(query)
for k, v in query.items():
if type(v)==list:
query[k] = {"$in": v}
return query
然后你可以像这样使用它:
self._db_conn[collection_name].find(query_lfixer(query))
或者您也可以通过任何其他方式转换 query
。
如果我有这样的 json:
query = {
"canonical.operatingSystemFamily": "Linux",
"canonical.region": "us-east-1"
}
我可以将它直接传递给 find 并且它有效:
self._db_conn[collection_name].find(query)
我也想这样做,但要使用列表,例如:
query = {
"canonical.operatingSystemFamily": ["Linux","Windows"],
"canonical.region": ["us-east-1", "us-east-2"]
}
有办法吗?我知道“$in”,但我不想解析我的查询数据。这是一个非常简化的例子,有很多字段可能存在也可能不存在。有没有办法直接将 json 与列表一起使用?
它不是一个解析器 - 只是检查 type
。
$ ipython
Python 3.8.10 (default, May 4 2021, 00:00:00)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.1.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: query = {
...: "canonical.operatingSystemFamily": ["Linux","Windows"],
...: "canonical.region": ["us-east-1", "us-east-2"]
...: }
In [2]: for k,v in query.items():
...: if type(v)==list:
...: query[k]={"$in": v}
...:
In [3]: query
Out[3]:
{'canonical.operatingSystemFamily': {'$in': ['Linux', 'Windows']},
'canonical.region': {'$in': ['us-east-1', 'us-east-2']}}
如果需要,您可以定义一个函数来在出现 list
时转换 query
。
from copy import deepcopy
def query_lfixer(query, copy=True):
if copy:
query = deepcopy(query)
for k, v in query.items():
if type(v)==list:
query[k] = {"$in": v}
return query
然后你可以像这样使用它:
self._db_conn[collection_name].find(query_lfixer(query))
或者您也可以通过任何其他方式转换 query
。