根据条件从mongo集合中获取一些数据

时间:2017-04-05 06:43:30

标签: java mongodb mongodb-query aggregation-framework

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)的{​​{1}}为409,对应的objId=45678_id。同样,121.89.2的{​​{1}}为405,相应的max(state)objId=78996。这就是为什么_id是预期的输出。我想在mongo中这样做。有什么建议吗?

2 个答案:

答案 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