【问题标题】:Comparison operator for the computed count value in MongoDB Aggregation PipelineMongoDB 聚合管道中计算的计数值的比较运算符
【发布时间】:2014-08-16 00:12:16
【问题描述】:

我正在使用聚合管道概念,下面是我使用的 Java 代码。

     DBObject match = new BasicDBObject("$match", 
          new BasicDBObject("field_name", "value"));

     DBObject group = new BasicDBObject("$group", 
          new BasicDBObject("_id" , "")
          .append("count", new BasicDBObject("$sum", 1)));

第一个管道运算符“$match”将过滤掉文档。第二个管道运算符“$group”将给出集合中的文档数量(在上面的示例中)。比方说,第三个管道运算符是 $project。

     List<DBObject> pipeline = Arrays.asList(match, group, project);     
     AggregationOutput output = users.aggregate(pipeline); 

我想要执行的操作是这样的 - 我想使用 $gte 运算符来计算 count 值(例如,if { count : { $gte : 5 } } 然后继续 $project else 退出)。

谁能帮我解决这个问题。

【问题讨论】:

  • 我不明白这一点。由于分组 _id 为空,您所做的只是获取匹配文档的数量。在基本查询中使用.count() 修饰符会更有效。
  • 是的..我在比赛前尝试了 .count() 并且 if(count>=5) 我继续使用 $match,它有效。 count() 将扫描集合中的所有文档并给出结果。接下来我会做$match,它也会扫描所有文件。 (count() 和 $match 在同一个“field_name”上)。所以想到在 $group 中使用计数。 (如果我使用 $match,next $sum,与将扫描所有文档的 count() 相比,扫描文档的数量会更少)
  • 请帮我解决另一个问题。链接是-stackoverflow.com/questions/25167849/…

标签: mongodb


【解决方案1】:

使用两个查询:count(),检查阈值,然后是 find(),必要时进行投影。据我所知,你不能基于某些条件提前终止聚合,所以虽然我认为你可以构建一个管道来准满足你的需求,但实际上你应该做最自然的事情。在 mongo shell 中,因为我没有方便测试的 Java 驱动程序:

> var t = db.test.count({ "field" : "value" })
> if (t > 5) {
    results = db.test.find({ "field" : "value"}, projection)
}

如果不了解您的更大目标是什么,很难为此提供好的代码。

【讨论】:

  • 我想要做的是 - 我想根据使用 $match 完成的“field_name”过滤掉文档。接下来计算匹配文档的数量。接下来,只有当这个计数 >=5 时,我才想在 $group 中使用 $avg。接下来使用 $project 并显示输出。请帮助我
  • 如果 count
  • 如果 count
  • 你不能阻止聚合管道通过它的阶段,但你可以让它在 count
  • 是的.. 我在 $match 之前尝试了 .count() 并且 if(count>=5) 我继续使用 $match, $group - $avg, $project 它有效。 count() 将扫描集合中的所有文档并给出结果。接下来我会做$match,它也会扫描所有文件。 (count() 和 $match 都在同一个“field_name”上,两次都需要扫描所有文档)。因此,我没有想到在 $group 中使用计数。 (如果我使用 $match,下一个计数:{$sum,1},$match 之后扫描的文档数量会比 count() 扫描所有文档的数量少)
【解决方案2】:

我认为您可以再次使用 $match 作为第三个管道运算符,链接: DBObject match2 = BasicDBObjectBuilder.start().push("$match").push("count").append("$gte ", 5).get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多