代码之家  ›  专栏  ›  技术社区  ›  Suresh Prajapati

Mongo查询最小最大值,不包括匹配条件

  •  0
  • Suresh Prajapati  · 技术社区  · 7 年前

    我有以下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_price , firstTradedRate 给定的体积 lastModifiedDate 匹配条件。现在我的问题是,我想去掉匹配条件的最小-最大计算。也就是说,它应该给我最大最小值 填充价格 与上次修改日期条件无关。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   s7vr    7 年前

    两个不同的查询可能是可行的,但是如果您喜欢在聚合管道中进行查询,可以利用 $facet 在3.6版。

    基本上,您在facet阶段内运行多个聚合管道查询,然后是结果的串联。

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

    pairModel.aggregate([{
      "$facet":{
        "lastfirst":[
          {"$match":{"lastModifiedDate":{"$exists":true,"$ne":null,'$gt':lt24hrTS,'$lt': nowTS}}},
          {"$sort":{"lastModifiedDate":1}},
          {"$group":{
            "_id":null,
            "volume":{"$sum":"$fill_qty"},
            "lastTradedRate":{"$last":"$fill_price"},
            "firstTradedRate":{"$first":"$fill_price"}
          }}
       ],
       "maxmin":[
         {"$group":{
           "_id":null,
           "AllTimeHigh":{"$max":"$fill_price"},
           "AllTimeLow":{"$min":"$fill_price"}}
         }
        ]
      }
    },
     {"$unwind":"$lastfirst"},
     {"$replaceRoot":{"newRoot":{"$mergeObjects":["$lastfirst", {"$arrayElemAt":["$maxmin", 0]}]}}
    }])
    
    推荐文章