これが状況です。私はこのようなドメインオブジェクトを持っています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")
2800ミリ秒かかります!!!
コマンドで一意のインデックスを正しく作成しました
db.products.ensureIndex({"RemoteId":1, unique:true})
.reIndex()
NB:はい、コマンドでインデックスも再構築しました
ここで奇妙なこと... LINQを回避し、リポジトリメソッドを変更する...
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 ミリ秒かかります。どうして??
最初のアプローチでは、2番目のアプローチではなくidが増加するため、パフォーマンスが低下するのはなぜですか?
Ps。ええと...私の英語で本当にごめんなさい