如何使这个MongoDB查询更有效?

时间:2014-03-25 08:08:45

标签: .net mongodb mongodb-query mongodb-.net-driver nosql

只是一个简单的查询,查看传入的对象列表并查找匹配的值。 AObjects是AObjects的列表。

var queries = AObjects
    .Select(g =>
        Query.And(
            Query<BObject>.EQ(m => m.SourceKey, g.SourceKey),
            Query<BObject>.EQ(m => m.SourceTypeId, g.SourceTypeId)
        )
    )
    .ToList();

var query = Query.Or(queries);

var result = Collection.Find(query).ToList();

return result;

现在,当我使用大量AObjects(2500,7500)运行此查询时,查询需要很长时间;分别为1分钟和8分钟。

SourceKey和SourceTypeId都为BObject的集合编制索引。

我觉得应该有一种更好的方法来构建这个查询以提高它的效率,但是当谈到NoSQL查询优化时,我有点像菜鸟。

感谢。

2 个答案:

答案 0 :(得分:1)

MongoDB(与大多数数据库一样)一次不能使用多个索引(除非它是Or查询)。这意味着虽然您维护2个索引,但只会选择和使用1个。

要为该特定查询构建索引,您需要"SourceKey""SourceTypeId"的复合索引:

AObjects.CreateIndex(IndexKeys<AObject>.Ascending(_ => _.SourceKey).Ascending(_ => _.SourceTypeId)

答案 1 :(得分:1)

我最终改变了查询的构建方式。

我没有依赖代码来构建查询,而是自己构建了json。

var sb = new StringBuilder();
sb.Append("{ $or:[");
geographies.ToList().ForEach(x =>
{
    var s = "{ " + string.Format("SourceKey:\"{0}\", SourceTypeId: {1} ", x.SourceKey, x.SourceTypeId) + " },";
    sb.Append(s);
});

sb.Remove(sb.Length - 1, 1);
sb.Append("]}");

BsonDocument query = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(sb.ToString());

var result = Collection.FindAs<MapGeography>(qDoc).ToList();

return result;

刚刚进行了一些测试。

2629项过去1:02.249,现在需要0:26.566 6364项目过去6:07.900,现在需要2:40.868

不理想,我想让这个更快地运行,但这现在可行。