我有一个要求,即在给定对象列表时,我需要排除已存在于我的数据库中的对象。
我沿着传统路线走下去,迭代对象,一次检查对象是否存在于我的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();
答案 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上),甚至不需要使用实际的数据文件。