【问题标题】:MongoDB $unwind more than one field and sort by timestampMongoDB $unwind 多个字段并按时间戳排序
【发布时间】:2016-06-30 07:24:09
【问题描述】:

我在那个查询中创建了一个查询,我正在使用 $unwind 多个字段。查询响应很好,但我的前辈建议我这是错误的查询。因为查询响应的格式不正确,也不是 r_y_b_phasetimestamp 时间戳的升序。我给出的查询如下:

 db.energy.aggregate([
    { 
        $project: { EventTS: 1, RPhaseVoltage: 1, YPhaseVoltage:1, BPhaseVoltage:1} 
    },
    {
        $unwind: {
            path: "$RPhaseVoltage",
            includeArrayIndex: "arrayIndex",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $unwind: {
            path: "$YPhaseVoltage",
            includeArrayIndex: "arrayIndex",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $unwind: {
            path: "$BPhaseVoltage",
            includeArrayIndex: "arrayIndex",
            preserveNullAndEmptyArrays: true
        }
    },
    {
      $match: {
            $and: [ 
                {RPhaseVoltage: {$ne: null}},
                {YPhaseVoltage: {$ne: null}},
                {BPhaseVoltage: {$ne: null}},
            ]
        }
    },
    {
        $project: {
            _id:0,
            EventTS:1,
            RPhaseVoltage: 1,
            YPhaseVoltage: 1,
            BPhaseVoltage:1,
            r_y_b_phasetimestamp: {
                "$add": [
                    { "$subtract": ["$EventTS", new Date("1970-01-01")]},
                    { "$multiply": [ 60000, "$arrayIndex" ] }
                ]
            }
        }
    },
    {
      $project: {
        "rvoltage_data":["$r_y_b_phasetimestamp", "$RPhaseVoltage"],
        "yvoltage_data":["$r_y_b_phasetimestamp", "$YPhaseVoltage"],
        "bvoltage_data":["$r_y_b_phasetimestamp", "$BPhaseVoltage"]
      }
    },
    {
        $sort:{
            r_y_b_phasetimestamp:-1
        }
    }
]);

我的收集样本如下

    { 
    "_id" : ObjectId("57742e0f8d8b8fdf278b45d1"), 
    "EventTS" : ISODate("2016-06-24T12:30:00.000+0000"), 
    "RPhaseVoltage" : [ 
        null, 
        231.81, 
        231.81, 
        null, 
        231.42
    ], 
    "YPhaseVoltage" : [ 
        229.95, 
        229.95, 
        null, 
        null, 
        231.32
    ], 
    "BPhaseVoltage" : [
        null, 
        231.44, 
        231.44, 
        null, 
        null
    ]
}

我的图表输出链接是Graph Plotting Link。我用于绘图的这个查询。请建议我我的查询是错误的,为什么图表会像这样绘制

【问题讨论】:

  • 给定示例文档,您对聚合结果的期望是什么?

标签: php mongodb mongodb-query


【解决方案1】:

您正在使用$project 2 次。当您使用$project 时,只有预计的值会传递到管道的下一部分。在使用排序之前,您不会投射r_y_b_phasetimestamp。因此,r_y_b_phasetimestamp 在排序时将是未定义的,并会导致未排序的结果。尝试在 "bvoltage_data":["$r_y_b_phasetimestamp", "$BPhaseVoltage"] 之后传递 r_y_b_phasetimestamp:"$r_y_b_phasetimestamp" 。所以最终的代码是

db.energy.aggregate([
{ 
    $project: { EventTS: 1, RPhaseVoltage: 1, YPhaseVoltage:1, BPhaseVoltage:1} 
},
{
    $unwind: {
        path: "$RPhaseVoltage",
        includeArrayIndex: "arrayIndex",
        preserveNullAndEmptyArrays: true
    }
},
{
    $unwind: {
        path: "$YPhaseVoltage",
        includeArrayIndex: "arrayIndex",
        preserveNullAndEmptyArrays: true
    }
},
{
    $unwind: {
        path: "$BPhaseVoltage",
        includeArrayIndex: "arrayIndex",
        preserveNullAndEmptyArrays: true
    }
},
{
  $match: {
        $and: [ 
            {RPhaseVoltage: {$ne: null}},
            {YPhaseVoltage: {$ne: null}},
            {BPhaseVoltage: {$ne: null}},
        ]
    }
},
{
    $project: {
        _id:0,
        EventTS:1,
        RPhaseVoltage: 1,
        YPhaseVoltage: 1,
        BPhaseVoltage:1,
        r_y_b_phasetimestamp: {
            "$add": [
                { "$subtract": ["$EventTS", new Date("1970-01-01")]},
                { "$multiply": [ 60000, "$arrayIndex" ] }
            ]
        }
    }
},
{
  $project: {
    "rvoltage_data":["$r_y_b_phasetimestamp", "$RPhaseVoltage"],
    "yvoltage_data":["$r_y_b_phasetimestamp", "$YPhaseVoltage"],
    "bvoltage_data":["$r_y_b_phasetimestamp", "$BPhaseVoltage"],
    r_y_b_phasetimestamp:"$r_y_b_phasetimestamp"
  }
},
{
    $sort:{
        r_y_b_phasetimestamp:-1
    }
}
]);

【讨论】:

  • 显示错误“$r_y_b_phasetimestamp 未定义”
  • 你能用r_y_b_phasetimestamp:1代替r_y_b_phasetimestamp:$r_y_b_phasetimestamp吗?
  • 这与多次使用 $project 无关 - 在同一管道中拥有多个项目阶段没有问题。
  • 是的。您可以在管道中有多个 $project 但您需要传递下一个管道所需的所有值。我想我的回答可能没有正确解释。编辑它以更好地解释它。
猜你喜欢
  • 2017-11-08
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2019-01-20
  • 2019-03-19
  • 2014-04-02
相关资源
最近更新 更多