[英]MongoDB Most Efficient Way to Perform this Query
我有一個要求,當給定對象列表時,我需要排除數據庫中已經存在的對象。
我采用了傳統的方法,即遍歷對象,然后一次檢查對象是否存在於我的mongo集合中。
foreach (PickerPlace pickerPlace in param)
{
string id = pickerPlace.id;
IMongoQuery query = Query<Place>.Where(p => p.Id == id);
int count = this.context.Place.AsQueryable().Count(q => query.Inject());
if (count == 0)
{
filteredResults.Add(pickerPlace);
}
}
return filteredResults;
這是做我想要達到的目標的最有效方法嗎?某種程度上,我覺得我應該執行某種批處理操作。
非常感謝
更新:
我發現以下代碼要高效得多,但是我仍然希望獲得有關如何進一步改進的建議。
List<string> ids = param.Select(p => p.id).ToList();
var results = this.context.Place.Find(Query.In("Id", new BsonArray(ids))).ToList();
最有效的選擇是這樣的:
var newIds = new HashSet<string>(param.Select(p => p.Id));
newIds.ExceptWith(
places.Find(Query<Place>.In(p => p.Id, newIds))
.SetFields(Fields<Place>.Include(p => p.Id))
.Select(p => p.Id));
HashSet
使用項目的GetHashCode(和Equals)實現有效的比較。 該查詢在單個查詢中返回所有現有項。 SetFields
僅返回ID,因此使用內置的_id
索引(可能在RAM上),甚至不需要使用實際的數據文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.