从数组中获取匹配的嵌入式文档

时间:2016-10-10 14:38:52

标签: mongodb mongodb-query aggregation-framework

我在MongoDB中使用以下结构获得了大量文档:

{
    "_id" : ObjectId("..."),
    "plant" : "XY_4711",
    "hour" : 1473321600,
    "units" : [
        {
            "_id" : ObjectId("..."),
            "unit_id" : 10951,
            "values" : [
                {
                    "quarter" : 1473321600,
                    "value" : 395,
                },
                {
                    "quarter" : 1473322500,
                    "value" : 402,
                },
                {
                    "quarter" : 1473323400,
                    "value" : 406,
                },
                {
                    "quarter" : 1473324300,
                    "value" : 410,
                }
            ]
        }
    ]
}

现在我需要查找quarter介于某些给定时间戳之间的所有嵌入文档值(例如: {$ gte:1473324300,$ lte:1473328800} )。

我只获得了from / to的unit_id和季度时间戳来过滤文档。而且我只需要按季度分组和排序的季度和值。

我是MongoDB的新手并阅读了有关find()aggregate()的内容。但我不知道该怎么做。 MongoDB 3.0安装在服务器上。

最后我知道了:

我只需拆开每个阵列,过滤掉我不需要的东西并将其重新组合在一起:

db.collection.aggregate([ 
    {$match : {$and : [{"units.values.quarter" : {$gte : 1473324300}}, {"units.values.quarter" : {$lte : 1473328800 }}]}}, 
    {$unwind: "$units"}, 
    {$unwind: "$units.values"}, 
    {$match : {$and : [{"units.values.quarter" : {$gte : 1473324300}}, {"units.values.quarter" : {$lte : 1473328800 }}]}}, 
    {$project: {"units": {values: {quarter: 1, "value": 1}, unit_id: 1}}}, 
    {$group: {"_id": "$units.unit_id", "quarter_values": {$push: "$units.values"}}} ,
    {$sort: {"_id": 1}}
])

会给:

{
    "_id" : 10951,
    "quarter_values" : [
        {
            "quarter" : 1473324300,
            "value" : 410
        },
        {
            "quarter" : 1473325200,
            "value" : 412
        },
        {
            "quarter" : 1473326100,
            "value" : 412
        },
        {
            "quarter" : 1473327000,
            "value" : 411
        },
        {
            "quarter" : 1473327900,
            "value" : 408
        },
        {
            "quarter" : 1473328800,
            "value" : 403
        }
    ]
}

有关详细说明,请参阅:Return only matched sub-document elements within a nested array

我想我将来必须切换到$ map或$ filter。感谢notionquest支持我的问题:)

1 个答案:

答案 0 :(得分:2)

请参阅下面的示例查询。我没有完全满足你的分组要求。但是,使用此示例查询,您应该能够更改并获得所需的输出。

Image.prototype.contructor = function(arguments){  // Webworker implementation }

//or

Image.prototype.setSrc = function(arguments){  // Webworker implementation }

var image = new Image('somePath.jpg'); //or 
image.setSrc('somePath.jpg');

示例输出: -

db.collection.aggregate([
    {$unwind : {path : "$units"}},
    {$match : {$and : [{"units.values.quarter" : {$gte : 1473324300}}, {"units.values.quarter" : {$lte : 1473328800 }}]}},
    {$project : {"units" : {values : {quarter : 1, "value" : 1},  unit_id : 1}}},
    {$group : { _id : "$units.unit_id", quarter_values : { $push :{ quarter : "$units.values.quarter", value : "$units.values.value"}}}},
    {$sort : {_id : 1 }}
]);