Java 根据条件从mongo收集中获取一些数据
我对mongo db相当陌生。我想从mongo的Java 根据条件从mongo收集中获取一些数据,java,mongodb,mongodb-query,aggregation-framework,Java,Mongodb,Mongodb Query,Aggregation Framework,我对mongo db相当陌生。我想从mongo的mnocollection收集中获取一些数据。此mnocollection有三个字段\u id、objId和state 我想返回所有\u id,它的max(state)小于或等于某个值。此数据组由objId创建。例如:where max(state)您需要使用db.collection.find()方法以mogodb样式向其传递查询 下面是find方法的文档 要在select查询中编写查询学习查询选择器,您提到了max(state)>410。状态的
mnocollection
收集中获取一些数据。此mnocollection
有三个字段\u id
、objId
和state
我想返回所有
\u id
,它的max(state)
小于或等于某个值。此数据组由objId
创建。例如:where max(state)您需要使用db.collection.find()
方法以mogodb样式向其传递查询
下面是find方法的文档
要在select查询中编写查询学习查询选择器,您提到了max(state)>410
。状态的最大值\u 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}}
]);
请添加您的mnocollection
和预期输出的示例文档此“db.mnocollection.find({“state”:{$lte:410},{u id:1})”@felix check nw.。我已经添加了示例数据和预期输出。很抱歉,它应该“小于或等于410”更新查询以包含小于410的内容“idVal”:{$first:$u id”}在上面的查询中该怎么办?首先是将“\u id”包含到下一个管道阶段。感谢您的回答…我面临性能问题…它一直在运行。事实上,我的收藏有很多字段…不仅仅是三个字段。我说了三个让问题变得简单。它的dev env和Its拥有200万个文档。
db.collection.aggregate([{
$group:
{
_id : "$objId",
"maxState" : {$max: "$state" },
"idVal" : {$first : "$_id"}
}},
{$match: { "maxState" : {$lt : 410} }}
]);
db.collection.aggregate([{
$group:
{
_id : "$objId",
"maxState" : {$max: "$state" },
"idVal" : {$first : "$_id"}
}},
{$match: { "maxState" : {$lt : 410} }},
{$project: { idVal : 1, _id : 0}}
]);
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}}
]);