我怎样才能使这个MongoDB查询更有效



只是一个简单的查询,查看传入的对象列表并查找匹配的值。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(255,7500)运行这个查询时,查询需要非常长的时间;分别为1分钟和8分钟。

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

我觉得应该有一个更好的方法来构建这个查询,使其更有效,但当涉及到NoSQL查询优化时,我有点像一个新手。

谢谢。

MongoDB(像大多数数据库一样)一次不能使用多个索引(除非是Or查询)。这意味着尽管您维护了2个索引,但只有1个将被选择和使用。

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

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

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

而不是依靠代码来构建查询,我只是自己构建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.5666364项过去用时6:07.900,现在用时2:40.868

不理想,我想让这个运行得更快,但现在这将工作。

相关内容

  • 没有找到相关文章

最新更新