我有以下请求类型。
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编写的。
我对架构更改,查询更改,注释方法都很好,只要它非常快且在概念上正确即可。
请告诉我。
答案 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/
的东西希望您可以轻松弄清楚如何编写查询。