Доступ к данным из mongodb - PullRequest
6 голосов
/ 22 июня 2019

У меня есть следующие типы запросов .

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
  }
 ]
 }

Я запрашиваю Монго ДБ следующим образом.

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);

Затем я перебираю документы и группирую поля в нужном формате.

Это написано с помощью весны.

Я в порядке с изменениями схемы, запросов, методов аннотаций, если это очень быстро и концептуально правильно.

Пожалуйста, сообщите мне.

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Вы должны использовать структуру агрегации. Статически импортируйте все методы вспомогательных классов и используйте приведенный ниже код.

Использование BasicDBObject устарело в новых версиях 3.x драйвера API. Вы должны использовать новый класс Document для аналогичных нужд.

import static com.mongodb.client.model.Accumulators.*;
import static com.mongodb.client.model.Aggregates.*;
import static java.util.Arrays.asList;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Projections.*;
import org.bson.conversions.Bson;

MongoCollection<Document> mongoEngCollection = mongoDbReader.getCollection();

List<Bson> obj = new ArrayList<>();
//Forming query using request parameter. requestAttributes contains map of request parameters.
for(Map.Entry<PathAttribute, PathValue<?>> entry : requestAttributes.entrySet()) {
   String key = entry.getKey().getName();
   //Check if key is not date and set the start and end date
   obj.add(eq(key, entry.getValue().getRawValue()));
}

//Build aggregation stages
Bson match = match(and(obj));
Bson group = group(
              first("user", "$name"), 
              sum("total_results", 1), 
              push("results", "$$ROOT")
);
Bson projection = project(fields(excludeId()));

//Query Mongodb
List<Document> results = mongoEngCollection .aggregate(asList(match, group, projection)).into(new ArrayList<Document>());

Подробнее об агрегации здесь https://docs.mongodb.com/manual/reference/operator/aggregation/

1 голос
/ 26 июня 2019

Этого можно достичь с помощью проекций и поисков в MongoDB. Применить самостоятельные объединения https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ Лимит что привезти https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/

Я надеюсь, вы легко поймете, как написать запрос.

...