只是一个简单的查询,查看传入的对象列表并查找匹配的值。 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查询优化时,我有点像菜鸟。
感谢。
答案 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
不理想,我想让这个更快地运行,但这现在可行。