【问题标题】:Getting some data out of mongo collection based on condition根据条件从 mongo 集合中获取一些数据
【发布时间】:2017-04-05 06:43:30
【问题描述】:

我对 mongo db 相当陌生。我想从我在 mongo 中的 mnocollection 集合中获取一些数据。这个mnocollection 具有三个字段_idobjIdstate

我想返回所有_id 小于或等于某个值的 max(state)。此数据由objId 分组。例如:where max(state)<=410

不确定是否能够正确解释。

在 SQL 中(可能是语法不正确,但您可能会了解预期的内容)我会写。

select t._id
from mnocollection t
 where exists (select 1 
                 from mnocollection b
                 group by b.objId
                where t.state = b.state
                having max(state) <= 410 )

mnocollection 中的样本数据:

        [
            {
                _id: 121.56.1,
                 state: 310,
                 objId: 45678,

            },
            {
                _id: 11.89.56,
                 state: 405,
                 objId: 78996,
            },
            {
                _id: 121.89.2,
                 state: 409,
                 objId: 45678,
            }
        ]

预期输出:

        [
            {_id: 121.89.2},
            {_id: 11.89.56}
        ]

在这里,如果我按objId 分组,那么objId=45678max(state) 是409,对应的_id121.89.2。同样,objId=78996max(state) 是 405,对应的 _id11.89.56。这就是为什么 _id: 121.89.2 &amp; 11.89.56 是预期的输出。我想在mongo中做到这一点。有什么建议吗?

【问题讨论】:

  • 请添加您的mnocollection 的示例文档和预期输出
  • 试试这个“db.mnocollection.find({ "state":{$lte:410} },{"_id":1})"
  • @felix check nw..我已添加示例数据和预期输出。

标签: java mongodb mongodb-query aggregation-framework


【解决方案1】:

在选择查询中,您提到了max(state) &gt; 410。状态_id: 121.89.2 &amp; 11.89.56 的最大值大于410

您可以使用此查询并根据您的要求更改最大状态条件。

db.collection.aggregate([{
$group:
         {
           _id : "$objId",
            "maxState" : {$max: "$state" },
            "idVal" : {$first : "$_id"}
         }},
          {$match: {  "maxState" : {$lt : 410} }}
]);

结果中只有 _id。我已经添加了项目。下面的查询应该为您提供 OP 中提到的预期结果。

db.collection.aggregate([{
$group:
         {
           _id : "$objId",
            "maxState" : {$max: "$state" },
            "idVal" : {$first : "$_id"}
         }},
          {$match: {  "maxState" : {$lt : 410} }},
          {$project: {  idVal : 1, _id : 0}}
]);

为了提高性能:-

我们可以过滤(即忽略状态为 gte 410 的所有文档)第一个管道中的文档,然后进行分组。所以,组聚合的文档数量更少。

db.collection.aggregate([
    {$match: {  "state" : {$lt : 410} }},
    {$group:
         {
           _id : "$objId",
            "maxState" : {$max: "$state" },
            "idVal" : {$first : "$_id"}
         }},     
    {$match: {  "maxState" : {$lt : 410} }},     
    {$project: {  idVal : 1, _id : 0}}
]);

【讨论】:

  • 抱歉应该是'小于等于410'
  • 更新了查询以包含小于 410
  • ""idVal" : {$first : "$_id"}" 这个在上面的查询中有什么作用?
  • 首先是将“_id”包含到下一个管道阶段。
  • 感谢您的回答...我面临性能问题...它一直在运行。实际上我的收藏有很多领域......不仅仅是三个。我说三个是为了让问题变得简单。它的开发环境和它有 200 万个文档。
【解决方案2】:

您需要使用 db.collection.find() 方法以 mogodb 样式向其传递查询。

这里是查找方法https://docs.mongodb.com/manual/reference/method/db.collection.find/的文档。

要编写查询学习查询选择器https://docs.mongodb.com/manual/reference/operator/query/#query-selectors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 2017-11-06
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-10-24
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多