【问题标题】:How can I query unknown values from arrays in mongodb如何从 mongodb 中的数组中查询未知值
【发布时间】:2020-01-16 07:11:39
【问题描述】:

我被卡住了,不知道该怎么做指定日期时间戳。我是 mongodb 新手,不完全确定该怎么做



    "_id" : ObjectId("5d7d5aa984323fa67c2e9002"),
    "exchange" : "binance",
    "instrument" : "XRPUSDT",
    "timeframe" : "1d",
    "candles" : {
        "2019-09-06:0000" : {
            "open" : 0.25616,
            "high" : 0.25868,
            "low" : 0.24692,
            "close" : 0.2511,
            "volume" : 63377736.0
        },
        "2019-09-07:0000" : {
            "open" : 0.25115,
            "high" : 0.26285,
            "low" : 0.25009,
            "close" : 0.25993,
            "volume" : 53971229.0
        },
        "2019-09-08:0000" : {
            "open" : 0.25989,
            "high" : 0.26591,
            "low" : 0.2555,
            "close" : 0.26205,
            "volume" : 65033003.0
        }

 "_id" : ObjectId("5d7d74925bff7734c6c348a0"),
    "exchange" : "binance",
    "instrument" : "XRPUSDT",
    "timeframe" : "1d",
    "candles" : {
        "2019-09-06:0000" : {
            "open" : 0.25616,
            "high" : 0.25868,
            "low" : 0.24692,
            "close" : 0.2511,
            "volume" : 63377736.0
        },
        "2019-09-07:0000" : {
            "open" : 0.25115,
            "high" : 0.26285,
            "low" : 0.25009,
            "close" : 0.25993,
            "volume" : 53971229.0
        },
        "2019-09-08:0000" : {
            "open" : 0.25989,
            "high" : 0.26591,
            "low" : 0.2555,
            "close" : 0.26205,
            "volume" : 65033003.0
        }

例如,我希望每个文档中的 close 值如何在 python3 中查询 mongodb 以返回类似 [“关闭”:0.2511、0.25993、0.26205、0.2511、0.25993、0.26205]

并且还从每个文档中获取所有时间戳,例如 [2019-09-06:0000, 2019-09-07:0000, 2019-09-08:0000, 2019-09-06:0000,2019-09-06:0000, 2019-09-07:0000, 2019 -09-08:0000]

【问题讨论】:

    标签: pandas mongodb time-series pymongo ccxt


    【解决方案1】:

    关键(如果你原谅双关语)是 .items() ,它允许你获取键值对。在此之后,其他一切都只是字典运算符,您可以根据需要进行操作。

    import pymongo
    
    db = pymongo.MongoClient()['mydatabase']
    
    db.pricedata.insert_one({
        "exchange": "binance",
        "instrument": "XRPUSDT",
        "timeframe": "1d",
        "candles": {
            "2019-09-06:0000": {
                "open": 0.25616,
                "high": 0.25868,
                "low": 0.24692,
                "close": 0.2511,
                "volume": 63377736.0
            },
            "2019-09-07:0000": {
                "open": 0.25115,
                "high": 0.26285,
                "low": 0.25009,
                "close": 0.25993,
                "volume": 53971229.0
            },
            "2019-09-08:0000": {
                "open": 0.25989,
                "high": 0.26591,
                "low": 0.2555,
                "close": 0.26205,
                "volume": 65033003.0
            }
        }
    })
    db.pricedata.insert_one(
        {
            "exchange": "binance",
            "instrument": "XRPUSDT",
            "timeframe": "1d",
            "candles": {
                "2019-09-06:0000": {
                    "open": 0.25616,
                    "high": 0.25868,
                    "low": 0.24692,
                    "close": 0.2511,
                    "volume": 63377736.0
                },
                "2019-09-07:0000": {
                    "open": 0.25115,
                    "high": 0.26285,
                    "low": 0.25009,
                    "close": 0.25993,
                    "volume": 53971229.0
                },
                "2019-09-08:0000": {
                    "open": 0.25989,
                    "high": 0.26591,
                    "low": 0.2555,
                    "close": 0.26205,
                    "volume": 65033003.0
                }
            }
        }
    )
    
    looking_for = 'close'
    for record in db.pricedata.find({}, {"candles": 1, "_id": 0}):
        for k, v in record['candles'].items():
            print (f'{k}: {v[looking_for]}')
    

    结果:

    2019-09-06:0000: 0.2511
    2019-09-07:0000: 0.25993
    2019-09-08:0000: 0.26205
    2019-09-06:0000: 0.2511
    2019-09-07:0000: 0.25993
    2019-09-08:0000: 0.26205
    

    【讨论】:

    • 我建议将时间戳作为键转换为字段名称为 date 或类似名称的 rval。这将大大简化您对日期和日期范围的查询。
    • 感谢您的帮助另一件事是我在另一个集合中尝试了这个,其中包含更多数据,并且数据结构与我得到的相同。Traceback(最近一次调用):print(v [ looking_for]) KeyError: 'close' 即使集合有密钥。我同时得到了想要的数据和那个错误
    • 你需要添加一些错误处理;将 print 语句包装在 try ... except 中并打印 k 和 v。这应该有助于隔离问题。
    • 好的,谢谢你帮助我找出了我忘记的问题 我尝试过的另一个集合有一些具有不同架构的文档
    • 重新获得您可以使用正则表达式或类似方法过滤输入数据的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2017-02-19
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多