【问题标题】:Asynchronous MongoDB equivalent to TSQL "exists" using MongoDB C#/.NET 2.0 Driver [closed]使用 MongoDB C#/.NET 2.0 驱动程序“存在”相当于 TSQL 的异步 MongoDB [关闭]
【发布时间】:2015-04-22 21:47:17
【问题描述】:

我想使用 MongoDB C#/.NET 2.0 驱动程序异步检查 MongoDB 中是否存在文档。我想以考虑性能最大化的方式进行查询。

例如,我们从

db.Collection.CountAsync(filter).Result;

这对性能来说不是很好的做法,尤其是在过滤器可以返回大量文档的情况下。

有点像

db.Collection.FindAsync(filter).Limit(1).Size();

会更好,但 FindAsync 不存在。

此外,我还看到对“字段选择”的引用似乎也可以很好地应用以最小化动态数据量,但 MongoDB 对我来说是新的,所以我还不知道我是否会在不知不觉中成为导致性能下降。

【问题讨论】:

  • 如果您包含您尝试过的内容并询问它是否是最好的方法,而不仅仅是询问代码,这将非常有帮助。在这种情况下没关系,但这非常接近更适合 se.CodeReview
  • 我想以最大化性能的方式进行查询。这对您意味着什么?在性能方面,您将什么称为“最大化”?请注意,异步查询不会比同步查询“更快”地执行。
  • @Pheonixblade9 你的意思是在帖子中有工作代码,对吧?请注意,CR's Help Center 明确 声明 询问“关于 X 的最佳实践是什么?” 是题外话,因此正如目前所说,这个问题会在 CR 上引起轰动. 合适的是:发布您自己的工作代码,并询问此代码是否符合有关 X 的最佳实践? - 有很大不同;)
  • @Mat'sMug 我的意思是他应该包含工作代码 - 但我不知道“最佳实践”问题与 CR 无关。直到
  • 我已经更新了问题。

标签: c# asynchronous mongodb-query


【解决方案1】:

经过一番挖掘,我发现了 CountAsync 方法上的 CountOptions 参数,它可以限制被计数的文档数量。

将计数限制为单个文档可以达到 TSQL 的“存在​​”等效项:

long count = db.Collection.CountAsync(filter, new CountOptions() { Limit = 1 }).Result;

bool exists = count > 0;

编辑:

希望这个 C# 扩展方法对某人有所帮助:

public static bool Any<T>(this IMongoCollection<T> collection, FilterDefinition<T> filter)
{
  if (collection == null)
  {
    throw new ArgumentNullException("collection");
  }

  long count = collection.CountAsync(filter, new CountOptions() { Limit = 1 }).Result;

  return count > 0;
}

用法...

  FilterDefinition<SomeDocClass> filter = Builders<SomeDocClass>.Filter.Eq(e => e.FieldName1, someValue);

  bool exists = _collection.Any(filter);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多