mongoose: найти значение внутри объекта, внутри массива внутри массива объектов

#mongodb #mongoose #mongodb-query

#mongodb #мангуст #mongodb-запрос

Вопрос:

Здравствуйте и извините за заголовок, это довольно сложно объяснить словами.

У меня есть данные с кратным уровнем :

-strategyParameters -> [wsent -> [ {confirmationCandle.timestamp} ] ]

Я пытаюсь запросить документы, имеющие внутри wSent, внутри strategyParameters временную метку confirmationCandle, превышающую определенное значение. Я попробовал несколько попыток с некоторыми вещами, похожими на это :

 db.getCollection('users').find({"exchange":"binance","pair":"LTCUSDT","timeframe":"1h","wSent.confirmationCandle.timestamp":{"$gt":1606644800000}})
 

Но это не увенчалось успехом, любая помощь будет высоко оценена.

ниже приведен конкретный пример документа внутри моей базы данных:

 {
"_id" : ObjectId("5fd7b0f1356b89312949963a"),
"email" : "test@test.com",
"password" : "$2b$10$egeg",
"strategyParameters" : [ 
    {
        "_id" : ObjectId("5fd7c9940d0f3033fc527547"),
        "pair" : "LTCUSDT",
        "strategy" : "w",
        "timeframe" : "1h",
        "exchange" : "binance",
        "wSent" : [ 
            {
                "_id" : ObjectId("5fd7adb9d157b430a05a87b1"),
                "firstBottom" : {
                    "open" : 79.46,
                    "high" : 80.07,
                    "low" : 78.29,
                    "close" : 78.91,
                    "timestamp" : 1606690800000.0,
                    "isTop" : false,
                    "isBottom" : true
                },
                "top" : {
                    "open" : 78.89,
                    "high" : 80.5,
                    "low" : 78.87,
                    "close" : 79.7,
                    "timestamp" : 1606694400000.0,
                    "isTop" : true,
                    "isBottom" : false
                },
                "seconBottom" : {
                    "open" : 79.73,
                    "high" : 79.84,
                    "low" : 78.55,
                    "close" : 79.29,
                    "timestamp" : 1606698000000.0,
                    "isTop" : false,
                    "isBottom" : true
                },
                "confirmationCandle" : {
                    "open" : 81.56,
                    "high" : 85,
                    "low" : 81.1,
                    "close" : 83.24,
                    "timestamp" : 1606744800000.0, <-- the target
                    "isTop" : false,
                    "isBottom" : false
                },
                "exchange" : "binance",
                "pair" : "LTCUSDT",
                "timeframe" : "1h"
            }
        ]
    }
]
}
 

Ответ №1:

Ваш запрос не соответствует, потому что поля, которые вы ищете, не соответствуют структуре документа. В образце документа нет exchange полей , pair , timeframe или wSent.confirmationCandle.timestamp . Но у него есть strategyParameters.wSent.exchange , strategyParameters.wSent.pair , strategyParameters.wSent.timeframe и strategyParameters.wSent.confirmationCandle.timestamp поля.

Ваш запрос должен выглядеть примерно так:

 db.getCollection("users").find({
  "strategyParameters.wSent.exchange": "binance",
  "strategyParameters.wSent.pair": "LTCUSDT",
  "strategyParameters.wSent.timeframe": "1h",
  "strategyParameters.wSent.confirmationCandle.timestamp": { $gt :1606644800000 }
})