MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में परिकलित समूह-दर फ़ील्ड

आप वास्तव में पहले "प्रोजेक्ट" के साथ ऐसा कुछ कर सकते हैं, लेकिन मेरे लिए $project की आवश्यकता के लिए यह थोड़ा प्रति-सहज ज्ञान युक्त है पहले चरण:

    Aggregation agg = newAggregation(
        project("quantity")
            .andExpression("dayOfMonth(date)").as("day")
            .andExpression("month(date)").as("month")
            .andExpression("year(date)").as("year")
            .andExpression("price * quantity").as("totalAmount"),
        group(fields().and("day").and("month").and("year"))
            .avg("quantity").as("averavgeQuantity")
            .sum("totalAmount").as("totalAmount")
            .count().as("count")
    );

जैसा कि मैंने कहा, प्रति-सहज ज्ञान युक्त जैसा कि आपको $group के अंतर्गत यह सब घोषित करने में सक्षम होना चाहिए मंच, लेकिन सहायक इस तरह से काम नहीं कर रहे हैं। क्रमबद्धता थोड़ा अजीब है (तारीख ऑपरेटर तर्कों को सरणी के साथ लपेटता है) लेकिन ऐसा लगता है कि यह काम करता है। लेकिन फिर भी, यह एक के बजाय दो पाइपलाइन चरण हैं।

इसमें क्या समस्या है? अच्छी तरह से चरणों को अलग करके "प्रोजेक्ट" भाग परिकलित फ़ील्ड प्राप्त करने के लिए पाइपलाइन में सभी दस्तावेज़ों के प्रसंस्करण को बाध्य करता है, जिसका अर्थ है कि यह समूह चरण पर जाने से पहले सब कुछ से गुजरता है।

दोनों रूपों में प्रश्नों को चलाकर प्रसंस्करण समय में अंतर स्पष्ट रूप से देखा जा सकता है। एक अलग प्रोजेक्ट चरण के साथ, मेरे हार्डवेयर पर क्वेरी की तुलना में निष्पादित होने में तीन गुना अधिक समय लगता है जहां सभी फ़ील्ड की गणना "समूह" ऑपरेशन के दौरान की जाती है।

तो ऐसा लगता है कि इसे ठीक से बनाने का एकमात्र वर्तमान तरीका पाइपलाइन ऑब्जेक्ट को स्वयं बनाना है:

    ApplicationContext ctx =
            new AnnotationConfigApplicationContext(SpringMongoConfig.class);
    MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate");

    BasicDBList pipeline = new BasicDBList();
    String[] multiplier = { "$price", "$quantity" };

    pipeline.add(
        new BasicDBObject("$group",
            new BasicDBObject("_id",
                new BasicDBObject("month", new BasicDBObject("$month", "$date"))
                    .append("day", new BasicDBObject("$dayOfMonth", "$date"))
                    .append("year", new BasicDBObject("$year", "$date"))
            )
            .append("totalPrice", new BasicDBObject(
                "$sum", new BasicDBObject(
                    "$multiply", multiplier
                )
            ))
            .append("averageQuantity", new BasicDBObject("$avg", "$quantity"))
            .append("count",new BasicDBObject("$sum",1))
        )
    );

    BasicDBObject aggregation = new BasicDBObject("aggregate","collection")
        .append("pipeline",pipeline);

    System.out.println(aggregation);

    CommandResult commandResult = mongoOperation.executeCommand(aggregation);

या यदि यह सब आपको संक्षिप्त लगता है, तो आप हमेशा JSON स्रोत के साथ काम कर सकते हैं और उसे पार्स कर सकते हैं। लेकिन निश्चित रूप से, यह वैध JSON होना चाहिए:

    String json = "[" +
        "{ \"$group\": { "+
            "\"_id\": { " +
                "\"month\": { \"$month\": \"$date\" }, " +
                "\"day\": { \"$dayOfMonth\":\"$date\" }, " +
                "\"year\": { \"$year\": \"$date\" } " +
            "}, " +
            "\"totalPrice\": { \"$sum\": { \"$multiply\": [ \"$price\", \"$quantity\" ] } }, " +
            "\"averageQuantity\": { \"$avg\": \"$quantity\" }, " +
            "\"count\": { \"$sum\": 1 } " +
        "}}" +
    "]";

    BasicDBList pipeline = (BasicDBList)com.mongodb.util.JSON.parse(json);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB C# के साथ एक निजी बैकिंग फ़ील्ड का मानचित्रण

  2. वैध वस्तु आईडी के लिए मोंगोडब कास्ट इश्यू में त्रुटि आ रही है

  3. स्थिति प्रतिशत के अनुसार समूह और योग MongoDb एकत्रीकरण

  4. अपवाद:BSON प्रकार EOO से दिनांक में कनवर्ट नहीं किया जा सकता

  5. mongoDB में किसी उपयोगकर्ता द्वारा बिताया गया कुल समय ज्ञात करें