Der Zugriff auf Daten von mongodb

Gibbs:

Ich habe folgende Arten von Anfragen .

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

Nur wenige Felder Beispiele:

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

Mongo DB-Datenformat:

Mongo DB speichert Details Benutzer bestellen. Jeder Auftrag enthält Benutzer Detail [10 Felder] und Auftragsdaten [30 Felder]

API hat standardmäßig letzten 30 Tagen von Aufträgen zu geben, wenn kein Datum genannt wird.

Meine Frage:

Wie kann ich diese Daten von Mongo db effizient lesen?

Was ich zur Zeit tue:

Ich bin Parsen der httprequestund das Hinzufügen dieser Felder einesmap

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

Ich habe alle Dokumente zu bekommen, wo diese beiden Felder passen und die Dokumente in der folgenden Form zurück.

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

Ich Abfrage Mongo db wie folgt.

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

Dann bin ich Iterieren die Dokumente und die Gruppierung der Felder als das gewünschte Format.

Es wird mit Feder geschrieben.

Ich bin gut mit Schemaänderungen, Abfrage Änderungen, Kommentierung Methoden, solange es ist sehr schnell und konzeptionell richtig.

Bitte berate mich.

user2683814:

Sie haben Aggregation-Framework zu verwenden. Statisch importieren alle Methoden von Hilfsklassen und verwenden Sie den Code unten.

Die Nutzung BasicDBObjectwird in neueren 3.x Treiber api veraltet. Sie sollten die neue Klasse verwenden Documentfür ähnliche Bedürfnisse.

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

Mehr über die Aggregation hier https://docs.mongodb.com/manual/reference/operator/aggregation/

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=226330&siteId=1
Empfohlen
Rangfolge