簡體   English   中英

MongoDB執行此查詢的最有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM