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)
的{{1}}为409,对应的objId=45678
为_id
。同样,121.89.2
的{{1}}为405,相应的max(state)
为objId=78996
。这就是为什么_id
是预期的输出。我想在mongo中这样做。有什么建议吗?
答案 0 :(得分:1)
在选择查询中,您提到了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}}
]);
答案 1 :(得分:0)
您需要使用db.collection.find()
方法以mogodb样式传递查询。
以下是查找方法https://docs.mongodb.com/manual/reference/method/db.collection.find/的文档。
编写查询学习查询选择器https://docs.mongodb.com/manual/reference/operator/query/#query-selectors