【问题标题】:MongoDB / Pymongo Query with Datetime带有日期时间的 MongoDB / Pymongo 查询
【发布时间】:2012-08-11 01:22:22
【问题描述】:

我正在尝试检索我通过 pymongo 插入到 mongodb 中的数据。

我的插入代码如下(通过正则表达式解析后)

if connection is not None:
    db.model.insert({"time": datetime.datetime(int(int3), int(int1),
                                               int(int2), int(int4),
                                               int(int5), int(int6),
                                               int(int7))})

然后我在 shell 中输入了两个数据点。

>>> start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764)
>>> end = datetime.datetime(2012, 2, 2, 6, 55, 3, 381)

然后我尝试查询这两个数据点之间的数据范围,并收到返回的内容。

>>> db.wing_model.find({'time': {'$gte': start, '$lt': end}})
<pymongo.cursor.Cursor object at 0x0301CFD0>
>>> db.wing_model.find({'time': {'$gte': start, '$lt': end}})
<pymongo.cursor.Cursor object at 0x0301C110>

数据如下。

[02/02/2012 06:32:07.334][INFO]
[02/02/2012 06:32:07.334][INFO]
[02/02/2012 06:32:07.334][INFO]
[02/02/2012 06:32:13.711][INFO]
[02/02/2012 06:32:13.711][INFO]
[02/02/2012 06:32:13.711][INFO]
[02/02/2012 06:32:22.473][INFO]
[02/02/2012 06:32:22.473][INFO]
[02/02/2012 06:32:22.473][INFO]
[02/02/2012 06:35:06.764][INFO]
[02/02/2012 06:35:06.765][INFO]
[02/02/2012 06:35:06.765][INFO]
[02/02/2012 06:54:52.008][INFO]
[02/02/2012 06:54:52.008][INFO]
[02/02/2012 06:54:52.008][INFO]
[02/02/2012 06:54:59.512][INFO]
[02/02/2012 06:54:59.512][INFO]
[02/02/2012 06:54:59.512][INFO]
[02/02/2012 06:55:03.381][INFO]
[02/02/2012 06:55:03.381][INFO]
[02/02/2012 06:55:03.381][INFO]
[02/02/2012 06:55:06.142][INFO]
[02/02/2012 06:55:06.142][INFO]
[02/02/2012 06:55:06.142][INFO]
[02/02/2012 06:55:09.652][INFO]
[02/02/2012 06:55:09.652][INFO]
[02/02/2012 06:55:09.652][INFO]
[02/02/2012 06:55:13.396][INFO]
[02/02/2012 06:55:13.396][INFO]

如何让我的查询返回“开始”和“结束”数据之间的所有内容?

另外,我如何以可理解的形式接收此信息?

最后,为什么同一个查询返回不同的光标对象位置?

谢谢。

【问题讨论】:

    标签: python mongodb datetime pymongo


    【解决方案1】:

    重复现有的基础教程文档:

    start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764)
    end = datetime.datetime(2012, 2, 2, 6, 55, 3, 381)
    
    for doc in db.wing_model.find({'time': {'$gte': start, '$lt': end}}):
        print doc
    

    最后,为什么同一个查询返回不同的游标对象 地点?

    应该在哪里出现这种情况?

    您会看到两个不同的游标实例,它们可能会返回相同的结果集 - 或者?

    【讨论】:

    • 我已经做到了。它返回为“语法错误:无效语法”突出显示文档。
    • 具体在哪里?如果您使用的是 Python 3,那么您当然需要 print() - 但我们不能猜测您的环境。因此,请考虑一下您盲目使用代码的行为。
    • 没关系。我一直忘记括号...你很有帮助。谢谢你。如果可以的话,你能告诉我如何提取查询的一部分并将其插入到 python 数组中吗?如果我想这样做,似乎我必须再次解析它。
    • 不适用于 Python 3.6.7 - bson.errors.InvalidDocument:无法编码对象:{datetime.datetime(2019, 2, 16, 14, 13, 2, 392578)
    【解决方案2】:
    @staticmethod
    def _get_results_to_json(data):
        """Get documents from a MongoDB search result.
        Transforms MongoDB BSON documents into JSON serializable documents.
        This process converts the ObjectIds into hexadecimal strings.
        Parameters
        ----------
        data : `~pymongo.cursor.Cursor`
            A MongoDB search result.
        Returns
        -------
        |list| of |dict|
            A list of JSON serializable documents.
        """
        if isinstance(data, Cursor):
            data = list(data)
    
        if isinstance(data, list):
            for doc in data:
                doc['_id'] = str(doc['_id'])
        elif isinstance(data, dict):
            data['_id'] = str(data['_id'])
    
        return data
    
    _get_results_to_json(db.wing_model.find({'time': {'$gte': start, '$lt': end}}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2020-05-26
      • 2014-12-09
      • 2011-09-29
      • 2020-05-16
      相关资源
      最近更新 更多