从mongodb访问数据

时间:2019-06-22 05:24:30

标签: java mongodb morphia

我有以下请求类型

server/controllerName/access_id/id/field/field_value/api_name
server/controllerName/access_id/id/field/field_value/field2/field_value/api_name

一些字段示例:

1. start date and end date
2. user name
3. user group

Mongo DB数据格式:

Mongo DB存储用户订单详细信息。每个订单包含用户详细信息[10个字段]和订单详细信息[30个字段]

如果未提及日期,

API必须默认提供最近30天的订单。

我的问题:

如何有效地从mongo db读取此数据?

我目前正在做什么:

我正在解析httprequest并将这些字段添加到map

{"name":"gibbs", "category":"vip"}

我必须获取这两个字段都匹配的所有文档,并以以下形式返回文档。

{
 user: "gibbs",
 total_Result: 10,
 [
  {
   //order details items from doc 1
  }
  {
   //order details from doc2
  }
 ]
 }

我正在按如下方式查询mongo db。

MongoCollection<Document> mongoEngCollection = mongoDbReader.getCollection();
        BasicDBObject andQuery = new BasicDBObject();
        List<BasicDBObject> obj = new ArrayList<BasicDBObject>();

        //Forming query using request parameter. requestAttributes contains map of request parameters.
        for(Map.Entry<PathAttribute, PathValue<?>> entry : requestAttributes.entrySet()) {
            String key = entry.getKey().getName();
            obj.add(new BasicDBObject(key, entry.getValue().getRawValue()));
        }

        andQuery.put("$and", obj);

        //Queryng mongo db
        FindIterable<Document> documents = mongoEngCollection.find(andQuery);

然后我要遍历文档并将字段分组为所需格式。

它是使用spring编写的。

我对架构更改,查询更改,注释方法都很好,只要它非常快且在概念上正确即可。

请告诉我。

2 个答案:

答案 0 :(得分:3)

您必须使用聚合框架。静态导入助手类的所有方法,并使用以下代码。

在更新的3.x驱动程序api中不推荐使用‘-n’ Do not output the trailing newline. 。您应该将新类BasicDBObject用于类似的需求。

Document

有关聚合的更多信息,请点击https://docs.mongodb.com/manual/reference/operator/aggregation/

答案 1 :(得分:1)

这可以通过在MongoDB中使用“投影和查找”来实现。 应用自我联接https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ 限制带来https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/

的东西

希望您可以轻松弄清楚如何编写查询。