嵌套对象中嵌套数组中的Mongodb聚合查询

时间:2018-04-01 02:10:20

标签: mongodb mongodb-query aggregation-framework

您好我正在尝试聚合嵌套对象上的嵌套数组,但是,我无法获得正确的结果。

这就是我的架构的样子;

mongoose.Schema({
    parity: {
        type: String,
        unique: true
    },
    dataSet: {
        oneHour:[{
            open: Number,
            high: Number,
            low: Number,
            close: Number,
            date: Date,
            btcVolume: Number,
            _id: false
        }],
        oneDay:[{
            open: Number,
            high: Number,
            low: Number,
            close: Number,
            date: Date,
            btcVolume: Number,
            _id: false
        }],
        _id: false
    },
    _id: {
        type: String
    }
});

这是我用来从集合中获取最新记录的聚合查询

db.stockentities.aggregate( {$match : {parity: "BTC-AMP"}}, {$project: {"dataSet.oneHour": 1}},  {$unwind: "$dataSet.oneHour"}, {$sort: {'date': -1}}, {$limit: 1} ).pretty()

相反,我得到了第一个元素。 (也试过没有项目管道)

{
    "_id" : "BTC-AMP",
    "dataSet" : {
        "oneHour" : {
            "open" : 0.00004583,
            "high" : 0.00004631,
            "low" : 0.00004566,
            "close" : 0.00004594,
            "btcVolume" : 1.39491494,
            "date" : ISODate("2018-01-31T01:00:00Z")
        }
    }
}

据我所知,结果的架构应该是这样的;

{
    "_id" : "BTC-AMP",
        "oneHour" : {
            "open" : 0.00004583,
            "high" : 0.00004631,
            "low" : 0.00004566,
            "close" : 0.00004594,
            "btcVolume" : 1.39491494,
            "date" : ISODate("2018-01-31T01:00:00Z")
        }
}

所以,我知道我的聚合查询有问题。谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

我解决了。需要提供sort的正确路径并交换展开和项目管道的顺序。

db.stockentities.aggregate( {$match : {parity: "BTC-AMP"}}, {$unwind: "$dataSet.oneHour"} ,{$project: {"oneHour": "$dataSet.oneHour"}}, {$sort: {"oneHour.date": -1}}, {$limit: 1} ).pretty()

给出

{
    "_id" : "BTC-AMP",
    "oneHour" : {
        "open" : 0.00003212,
        "high" : 0.00003335,
        "low" : 0.0000321,
        "close" : 0.00003301,
        "btcVolume" : 5.46422374,
        "date" : ISODate("2018-03-31T23:00:00Z")
    }
}