MongoDB在find()中展开?和find()查询的性能更好?

时间:2018-04-03 13:22:36

标签: mongodb performance aggregation-framework

我有这个聚合查询,这需要很长时间才能得到结果,因为$ unwind参数我只需要聚合框架。具体来说,我必须查询数组中的内容。如何将此聚合查询重写为查找查询,您认为使用find会更好吗?

db.cms.aggregate([{"$unwind":"$values"},
                       {"$match": {"values.timestamp":{"$exists":1}}},
                       {"$match": {"values.sensor":"V1"}},
                       {"$match": {"values.timestamp":{"$gte":"2018-02-07 14:00:16.163","$lte":"2018-02-07 14:00:16.163"}}}] )

集合中的文档看起来像这样

_id" : ObjectId("5a8ac17569191602538b65d2"), 

"values" : [
    {
        "sensor" : "B", 
        "unit" : "mm/s2", 
        "timestamp": "2018-02-07 14:00:16.163"

    }, 
    {
        "sensor" : "Bp", 
        "unit" : "mm/s2", 
        "timestamp": "2018-02-07 14:00:16.163"
    }, 
    {
        "sensor" : "Bt", 
        "unit" : "mm/s2",
        "timestamp": "2018-02-07 14:00:16.163"
    }, 
    {
        "sensor" : "V1", 
        "timestamp" : "2018-02-07 14:00:16.163", 
        "unit" : "V" 

    }]}

1 个答案:

答案 0 :(得分:1)

如果只需要过滤掉,只需使用$filter运算符:

db.cms.aggregate([
{
    $project: {
        values : {
            $filter: {
                input: "$values",
                as: "value",
                cond: {
                    $and: [
                        { $ifNull: [ "$$value.type", false ] },
                        { $eq: [ "$$value.sensor", "V1" ] },
                        { $eq: [ "$$value.timestamp", "2018-02-07 14:00:16.163" ] },
                    ]
                }
            }
        }
    }
}
])

顺便说一下,聚合cond运算符的$filter字段需要一个解析为布尔值的表达式。我们不能用 $exists或任何查询运算符,其聚合等效项是$ifNull运算符。