【问题标题】:How to create dynamic PyMongo query handling ISODate?如何创建动态 PyMongo 查询处理 ISODate?
【发布时间】:2020-05-28 18:08:43
【问题描述】:

我正在开发一个 Flask REST API,它将具有三个查询参数(HomeDevice、Key、UpdateDate),全部作为字符串传递。现在,我必须使用这三个输入作为过滤器在 Mongodb 上进行 PyMongo 查询。

typeof db.getCollection('collection_name').findOne().updatedate
>> Object
import json
from pymongo import MongoClient
import pandas as pd

client = MongoClient(<ServerAddress>,27017)
db = client.db_name
col = db.collection_name

updatedate="2020-01-13 06:43:47.500Z"
print(updatedate)

var = '{ "$and" : [{"homeDevice" : "Loader"} , {"key" : "OP2561NX" },{"updatedate" : ISODate("2020-01-13 06:43:47.500Z")}]}'
data = json.loads(var)
docs = pd.DataFrame(list(col.find(data)))
print(docs) 

ISODate(updateDate) 导致 JSONDecodeError,删除 ISODate 转换后,查询获取空帧

JSONDecodeError                           Traceback (most recent call last)
<ipython-input-12-95360c676df4> in <module>
     11 
     12 var = '{ "$and" : [{"homeDevice" : "Loader"} , {"keyed" : "OP2561NX" },{"updatedate" : ISODate("2020-01-13 06:43:47.500Z")}]}'
---> 13 data = json.loads(var)
     14 docs = pd.DataFrame(list(col.find(data)))
     15 print(docs)

E:\Analytics\Installations\Anaconda3\lib\json\__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    346             parse_int is None and parse_float is None and
    347             parse_constant is None and object_pairs_hook is None and not kw):
--> 348         return _default_decoder.decode(s)
    349     if cls is None:
    350         cls = JSONDecoder

E:\Analytics\Installations\Anaconda3\lib\json\decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

E:\Analytics\Installations\Anaconda3\lib\json\decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 1 column 81 (char 80)

直接在 monogodb (Robo3T) 中运行此查询会返回数据。我需要一种动态创建查询并在更新键上应用 ISODate 的方法。

如何创建动态 PyMongo 查询来处理 ISODate?

【问题讨论】:

  • 我认为问题出在varcol.find() 的参数应该是字典,而不是 JSON 或字符串。
  • 如果我不会在 find() 中传递 updateDate,我可以从 Mongodb 中获取数据。因此,显然 col.find() 可以将 JSON 作为参数。

标签: json python-3.x mongodb pymongo bson


【解决方案1】:

像字典一样构造var

var = { "$and" : [{"homeDevice" : "Loader"} , {"key" : "OP2561NX" },{"updatedate" : ISO("2020-01-13 06:43:47.500Z")}]}

并像这样使用它:

col.find(var)

您不需要将其转换为字符串/JSON。

尝试以上方法并告诉我。

【讨论】:

  • 在字典中使用 ISODate 作为查询传递给 PyMongo 将无法正常工作。它会给出与 JSON 加载相同的错误。在字典中使用 dateutil 有所帮助。 ` import dateutil dateStr = '2020-01-13 06:43:47.500Z' util_updatedate = dateutil.parser.parse(dateStr) ` 将其标记为已回答。谢谢@ngShravil.py
猜你喜欢
  • 2011-11-30
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2012-02-09
  • 2018-10-27
相关资源
最近更新 更多