按ISODate

时间:2016-05-19 14:55:02

标签: mongodb database-performance isodate

我有这种简单的聚合查询

db.SomeCollection.aggregate([{
  "$match": {
    "Id": "someId"
  }
}, {
  "$sort": {
    "someISODatePropertyName": 1
  }
}, {
  "$unwind": {
    "path": "$somePropertyName"
  }
}], {
  allowDiskUse: true
})

此查询最多返回50个项目,需要10秒钟才能完成。

如果我只是用数字改变sort属性:

db.SomeCollection.aggregate([{
  "$match": {
    "Id": "someId"
  }
}, {
  "$sort": {
    "someNumericPropertyName": 1
  }
}, {
  "$unwind": {
    "path": "$somePropertyName"
  }
}], {
  allowDiskUse: true
})

查询需要几毫秒才能完成。

ISODate属性是否存在任何排序问题?

我真的不明白为什么第一个版本需要这么长时间。

谢谢。

更新

这是查询结果,“explain”标志设置为true(注意:在ISODate字段上有一个索引):

{
    "waitedMS" : NumberLong(0),
    "stages" : [ 
        {
            "$cursor" : {
                "query" : {
                    "StreamId" : "5b8cc895-c626-5994-95d4-b9ac89fb66ed"
                },
                "sort" : {
                    "CommitStamp" : 1
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "vrp-events-prod.Commits",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "StreamId" : {
                            "$eq" : "5b8cc895-c626-5994-95d4-b9ac89fb66ed"
                        }
                    },
                    "winningPlan" : {
                        "stage" : "FETCH",
                        "filter" : {
                            "StreamId" : {
                                "$eq" : "5b8cc895-c626-5994-95d4-b9ac89fb66ed"
                            }
                        },
                        "inputStage" : {
                            "stage" : "IXSCAN",
                            "keyPattern" : {
                                "CommitStamp" : 1
                            },
                            "indexName" : "CommitStamp_Index",
                            "isMultiKey" : false,
                            "isUnique" : false,
                            "isSparse" : false,
                            "isPartial" : false,
                            "indexVersion" : 1,
                            "direction" : "forward",
                            "indexBounds" : {
                                "CommitStamp" : [ 
                                    "[MinKey, MaxKey]"
                                ]
                            }
                        }
                    },
                    "rejectedPlans" : []
                }
            }
        }, 
        {
            "$unwind" : {
                "path" : "$Events"
            }
        }
    ],
    "ok" : 1
}

1 个答案:

答案 0 :(得分:0)

根据我的经验,在日期字段上没有索引的日期排序很慢。假设您经常阅读此集合并通常按日期排序,添加索引将是理想的解决方案。

db.collection.createIndex(" someISODatePropertyName":1或-1)

尝试一下,它对我来说总是有很大的不同。

<强>更新

假设这并没有太大地减慢您的写入查询速度,请添加一个涵盖匹配和排序的索引:

db.xxx.createIndex({&#34; StreamId&#34;:1,&#34; CommitStamp&#34;:1});

我在我的集​​合上对此进行了测试,并将查询从15秒(使用日期索引)加速到不到一秒(使用新创建的索引)。仅供参考,我的最新解释显示:

var value = new ODataEnumValue( nEnumIntValue.ToString(), enumType.FullName() );
entity.TrySetPropertyValue( col.ColumnName, value );