我对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分组,则max(state)objId=45678是409,对应的_id121.89.2。同样,max(state)objId=78996是405,相应的_id11.89.56。这就是为什么_id: 121.89.2 & 11.89.56 是预期输出的原因。我想在蒙哥这样做。有什么建议吗?

最佳答案

在选择查询中,您提到了max(state) > 410。状态_id: 121.89.2 & 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}}
]);

关于java - 根据条件从mongo收集中获取一些数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43223697/

10-09 17:41