MongoDB执行此查询的最有效方法

时间:2014-08-17 08:36:47

标签: c# performance mongodb mongodb-.net-driver mongodb-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();

1 个答案:

答案 0 :(得分:1)

最有效的选择是:

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上),甚至不需要使用实际的数据文件。