【问题标题】:MongoDB aggregate function: $sort not working with $sample?MongoDB 聚合函数:$sort 不能与 $sample 一起使用?
【发布时间】:2018-05-12 06:06:28
【问题描述】:

我目前未能构建一个首先使用排序然后输出一个样本的 mongoDB 查询。数据库中的文档如下所示:

{
    "_id" : "cynthia",
    "crawled" : false,
    "priority" : 2.0
}

我正在尝试实现以下目标:给我一个具有最高优先级的随机元素。
我使用以下查询对其进行了测试:

db.getCollection('profiles').aggregate([
   {$match: {crawled: false }}, 
   {$sort: {priority: -1}}, 
   {$sample: {size: 1}}
]) 

很遗憾,这不起作用。 Mongo 似乎完全忽略了$sort。我认为与$sort 一起使用没有区别。

有更多 mongoDB 经验的人对此有什么想法吗?如果您有更好地实现“优先级”功能的想法,请告诉我。

每个想法都受到高度赞赏。

【问题讨论】:

  • 您是否要获得“一个”随机值?如果是这样,那么您认为优先级与此有什么关系?
  • 我们有几个服务使用这个查询来获取他们应该从事的当前工作。通过使用一些随机性,我试图阻止它们相互阻挡。对于我们的用例来说,这已经足够节省了。有了这个优先级,我们试图创造就业机会,这应该是首要的工作。不知道,如果他们是实现它的更好方法..
  • 下面的答案“假定”您的意思是$limit,但关键字错误。所以这显然不是你要问的。我问你是否真的打算“一个”是随机的,然后实际解释应该如何应用优先级。真的不清楚你的期望是什么,语言也没有清楚地表达出来。我想如果你能从 5 到 10 个样本文件中向我们展示你期望发生的事情。如果您基本上可以通过显示文档和您期望发生的事情来“画出那个”,那么每个人都会非常清楚。
  • 嗨,尼尔,很抱歉回答迟了。我现在将 mickls 的答案标记为正确,因为它最接近我想要实现的目标。 $limit 和之后的 $sample 的组合完全符合我们的预期。在使用的字段上启用索引非常重要。谢谢大家:)

标签: mongodb


【解决方案1】:

$sample 不是您想要的。根据文档:

从其输入中随机选择指定数量的文档。

因此,您将从过滤后的一组文档中随机获得一个文档。

$limit 是您所需要的,因为它需要前阶段的第一个 n 文档。您的管道应如下所示:

db.profiles.aggregate([
    {$match: {crawled: false }}, 
    {$sort: {priority: -1}}, 
    {$limit: 1}
])

【讨论】:

  • 感谢您的回答!限制是个好主意。在选择结果时我仍然希望有一些随机性,因为这是我们廉价的“非阻塞”查询设计。我们有几个工作人员使用查询结果来完成他们的工作,我不希望工作人员错误地处理相同的结果。我现在这样做了:([ {$match: {crawled: false }}, {$sort: {priority: -1}}, {$limit: 10}, {$sample: {size: 1}} ])
猜你喜欢
  • 2020-12-25
  • 2020-08-02
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多