只是一个简单的查询,查看传入的对象列表并查找匹配的值。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
不理想,我想让这个运行得更快,但现在这将工作。