我对mongo db相当陌生。我想从mongo的 mnocollection
集合中获取一些数据。该mnocollection
具有三个字段_id
,objId
和state
。
我想返回所有_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,对应的_id
是121.89.2
。同样,max(state)
的objId=78996
是405,相应的_id
是11.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/