如何在JAVA中直接从mongodb获取属性值

46qrfjad  于 2023-02-07  发布在  Go
关注(0)|答案(1)|浏览(159)

大家好,我有一个像bellow这样的文档集合,我想直接从roles数组中获取“权限”参数:_id,组._id,角色._id使用java mongo驱动程序。

{
  "_id": 1000002,
  "groups": [
    {
      "_id": 1,
      "roles": [
        {
          "rights": 3,
          "_id": 1
        },
        {
          "rights": 7,
          "_id": 2
        },
        {
          "rights": 3,
          "_id": 3
        }
      ]
    }
  ],
  "timestamp": {
    "$date": {
      "$numberLong": "1675267318028"
    }
  },
  "users": [
    {
      "accessProviderId": 1,
      "rights": 1,
      "_id": 4
    },
    {
      "accessProviderId": 1,
      "rights": 3,
      "_id": 5
    }
  ]
}

我有代表这个文档的AccessListItem类,我已经使用Bson过滤器从mongo中获取它,但是在获取之后,我必须通过java函数获取信息。我想直接从mongo库中获取int值。

Bson fileFilter = Filters.eq("_id", itemId);
        Bson groupFilter = Filters.elemMatch("groups", Document.parse("{_id:"+groupId+"}"));
        Bson roleFilter = Filters.elemMatch("groups.roles", Document.parse("{_id:"+role+"}"));

        Bson finalFilter = Filters.and(fileFilter, Filters.and(groupFilter,roleFilter));

        MongoCollection<AccessListItem> accessListItemMongoCollection =      MongoUtils.getAccessCollection(type);
        AccessListItem accessListItem =  accessListItemMongoCollection.find(finalFilter).first();
bgtovc5b

bgtovc5b1#

简单的回答是你不能。
MongoDB是为返回文档而设计的,也就是包含键-值对的对象,MongoDB查询没有只返回一个值的机制,也就是说,它永远不会只返回3[3]
您可以使用聚合,并在最后使用$project stage,以获得简化的对象,如:

{ rights: 3}

在javascript中可能看起来像:

db.collection.aggregate([
  {$match: {
      _id: itemId,
      "groups._id": groupId,
      "groups.roles._id": role
  }},
  {$project: {
      _id: 0,
      group: {
        $first: {
          $filter: {
            input: "$groups",
            cond: {$eq: ["$$this._id",groupId]}
          }
        }
      }
  }},
  {$project: {
      "roles": {
        $first: {
          $filter: {
            input: "$group.roles",
            cond: { $eq: [ "$$this._id",role]}
          }
        }
      }
  }},
  {$project: {
      rights: "$roles.rights"
  }}
])

示例:Playground
我不熟悉springboot,所以我不确定它在Java中是什么样子的。

相关问题