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