情况就是这样.我有一个像这样的域对象Product...

[DataContract]
public class Product : IStorableEntity
{
    [DataMember]
    public String Id { get; set; }
    [DataMember]
    public String RemoteId { get; set; }
    [DataMember]
    public String LanguageId { get; set; }
    [DataMember]
    public DateTime? CreationDate { get; set; }
    [DataMember]
    public DateTime? LastUpdate { get; set; }
    ETC..ETC...
}

在我的存储库层中,我有以下方法.

public IEnumerable<TElement> Read()
{
    var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
    return mongoCollection.AsQueryable<TElement>();

}

使用这种方法,我希望通过LINQ公开我的存储库层,而不导出有关技术的信息.

这样我就能做到:

var _repository = new MyRepositoryFactory<Product>(); 
var result = _repository.Read().Where(p=>p.RemoteId == "1")

此查询需要1或2毫秒.

相反

var _repository = new MyRepositoryFactory<Product>();
var result = _repository.Read().Where(p=>p.RemoteId == "29000")

it takes 2800 milliseconds!!!

我已经用命令正确地创建了一个唯一的索引

db.products.ensureIndex({"RemoteId":1, unique:true})

NB: Yes, I have also rebuilt the indexes with 100 command

奇怪的是...

public IEnumerable<TElement> Read(string remoteId)
{
    var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
      var query = Query<TElement>.EQ(p => p.RemoteId, remoteId);
    return mongoCollection.Find(query);
}

如果我调用之前具有相同id的方法..

var _repository = new MyMongoRepository<Product>();
var result = _repository.Read("29000")

这需要1到2毫秒.为什么?

为什么在第一种方法中,随着id的增加,性能会下降,而在第二种方法中,不是吗?

附言,呃...真为我的英语感到抱歉

推荐答案

正如WiredPainie在 comments 中所说,您应该使用IQueryable而不是IEnumerable,否则将检索整个集合.

Mongodb相关问答推荐

如何从MongoDB集合中获取第一个和最后一个元素?

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

MongoDB 按 created_at 月聚合

错误起草的 MongoDB 聚合管道 $match 阶段

MongoDB PHP UTF-8 问题

为什么使用整数作为 pymongo 的键不起作用?

是否可以迭代 mongo 游标两次?

在一个变量上运行的 Node JS 中使用正则表达式的 Mongo 查询

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

我怎样才能排序空值在 mongodb 中是最后排序的?

Mongoose $push 不断添加两个条目

MongoDB 1.6.5:如何重命名集合中的字段

Spring Mongo 条件查询两次相同的字段

使用 MongoDB 进行嵌套分组

Mongoose 连接认证失败

如何向 mongodb 2.6 添加身份验证?

MongoDB:聚合框架: $match between fields

是否可以在 Mongodb 中的两个数据库之间进行 $lookup 聚合?

Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?

Hadoop Map/Reduce 与内置 Map/Reduce