【问题标题】:Select documents randomly随机选择文档
【发布时间】:2018-12-26 15:11:38
【问题描述】:

我想知道是否有办法在 CosmosDB (Microsoft Azure) 中随机选择文档。

这是我的代码,我不知道在“Take(20)”之前添加什么:

public List<LeafBook> BooksList { get; private set; }

public async Task<List<LeafBook>> GetBookAsync()
{
    try
    {
        // The query excludes completed TodoItems

        var query = client.CreateDocumentQuery<LeafBook>(collectionLink, new FeedOptions { MaxItemCount = -1 })

             .Take(20)            
             .AsDocumentQuery();

        BooksList = new List<LeafBook>();
        while (query.HasMoreResults)
        {
            BooksList.AddRange(await query.ExecuteNextAsync<LeafBook>());
        }

    }
    catch (Exception e)
    {
        Console.Error.WriteLine(@"ERROR {0}", e.Message);
        return null;
    }
    return BooksList;
}

【问题讨论】:

  • 没有用于提取随机样本的本地方法(除非您将 MongoDB API 与聚合管道一起使用)。也许考虑随机化数据域中的一组已知值?日期范围?
  • 如果你有我会采纳的想法,我没有办法
  • 每个文档都有一个字段:“NumberoftheBook”,它是文档的存储数量(就像 SQL 数据库的唯一 ID)

标签: c# azure azure-cosmosdb


【解决方案1】:

kikis,正如@David Makogon 在评论中所说,您可以关注由feedback 链接的sample,以在 cosmos db mongo api 中获得随机结果。

但是,cosmos db sql api 中没有这样的原生功能。所以,也许您需要采用解决方法。

你可以使用stored procedure在cosmos db中实现这样的功能,请参考这个blog

在此解决方法中,最重要的是它可能会遍历您的整个集合,具体取决于您在执行时传递给存储过程的 filterString 的值。您应该确保 filterString 在数据库上尽可能轻量级。

或者您可以在查询之前获得 20 个随机的 NumberoftheBook 属性,并将其用作查询过滤器。

【讨论】:

  • 感谢您的回答。我试过这个来获取一个文档: var query = client.CreateDocumentQuery(collectionLink, new FeedOptions { MaxItemCount = -1 }) .Where(b=> b.NumberOfTheBook==10) .AsDocumentQuery();但我有这个错误:System.ArgumentNullException:值不能为空。参数名称:来源
  • @kikis 你的意思是你在使用linq过滤文档时遇到了错误?
【解决方案2】:

我会这样做。

  1. 使用
    dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")

  2. 获取集合中的文档总数
  3. 使用Random 在0 和从上面获得的总数(减1)之间随机选择ints。

  4. 在索引(在步骤2中)获取与(在步骤1中)获得的ids对应的文档

我还没有尝试过,但请告诉我!

【讨论】:

  • 谢谢,但我不知道如何适应:dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c") with : var query = client.CreateDocumentQuery(collectionLink, new FeedOptions { MaxItemCount = -1 }) .Take(20) .AsDocumentQuery();
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
相关资源
最近更新 更多