Mongo查询的最小值,最大值,匹配条件除外

时间:2018-07-24 14:51:53

标签: mongodb aggregation-framework

我有以下pairModel收集模式:

[{
    "_id" : ObjectId("5afaf31c8e7cd4d7e5675f17"),
    "trans_id" : 2910372,
    "fill_qty" : 3275466,
    "fill_price" : 610600,
    "fill_flags" : 2,
    "currencyPair" : "BTC-INR",
    "lastModifiedDate" : 1526395676478,
    "__ds" : {
        "_v" : 1
    },
    "ds_key" : "jh7skpq6-1lcoebwn5j3"
},
{
    "_id" : ObjectId("5afaf3158e7cd4d7e5675e6d"),
    "trans_id" : 2910369,
    "fill_qty" : 276777,
    "fill_price" : 610600,
    "fill_flags" : 2,
    "currencyPair" : "BTC-INR",
    "lastModifiedDate" : 1526395669729,
    "__ds" : {
        "_v" : 1
    },
    "ds_key" : "jh7skkip-1pomnhe1sv0"
},
{
    "_id" : ObjectId("5afaf30f8e7cd4d7e5675dfe"),
    "trans_id" : 2910366,
    "fill_qty" : 180150,
    "fill_price" : 610600,
    "fill_flags" : 2,
    "currencyPair" : "BTC-INR",
    "lastModifiedDate" : 1526395663092,
    "__ds" : {
        "_v" : 1
    },
    "ds_key" : "jh7skfec-16my2i58gl3"
},
{
    "_id" : ObjectId("5afa7ea48e7cd4d7e55f0a15"),
    "trans_id" : 2907344,
    "fill_qty" : 6895,
    "fill_price" : 610600,
    "fill_flags" : 2,
    "currencyPair" : "BTC-INR",
    "lastModifiedDate" : 1526365860103,
    "__ds" : {
        "_v" : 1
    },
    "ds_key" : "jh7atn9j-22lylcn1u72"
}
]

和下面是我的查询:

pairModel.aggregate([
        {
            '$match': {
                'lastModifiedDate': {'$exists': true, '$ne': null, '$gt': lt24hrTS, '$lt': nowTS}
            }
        },
        {
            '$group': {
                '_id': null,
                '24hoursHigh': {'$max': '$fill_price'},
                '24hoursLow': {'$min': '$fill_price'},
                "volume": { "$sum": "$fill_qty"},
                "lastTradedRate": { "$last": "$fill_price"},
                "firstTradedRate": { "$first": "$fill_price"},
            }

        },
        { "$sort": { "lastModifiedDate": 1 } }
        ])

这给了我fill_pricefirstTradedRate和给定lastModifiedDate匹配条件下的音量的低点。现在我的问题是,我想从匹配条件中取出最小-最大计算值。也就是说,无论lastModifiedDate条件如何,它都应该给我fill_price的最小值-最大值。

可以通过两个不同的查询轻松查询完整的数据,但是可以修改上面的聚合查询以满足单个查询中的所有条件吗?

1 个答案:

答案 0 :(得分:1)

可能要经过两个不同的查询,但是如果您想在聚合管道中进行操作,则可以使用3.6版本的$facet

基本上,您正在构面阶段内运行多个聚合管道查询,然后将结果串联。

此外,发现了您的代码中的一些问题并进行了修复。

request.setHeader('Connection', 'keep-alive, close')
request.setHeader('Cache-Control', 'no-cache')
request.setHeader('Accept-Encoding', '*')