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

स्प्रिंग डेटा मिलान और फ़िल्टर नेस्टेड सरणी

मैं "polaire" की "प्रथम" सरणी अनुक्रमणिका से मिलान करने के लिए यहां कुछ मानों को हार्डकोड करने जा रहा हूं और "matrice" . की "दूसरा" सरणी अनुक्रमणिका प्रदर्शन के लिए। यहां $elemMatch . के उपयोग पर ध्यान दें $match . में एकत्रीकरण पाइपलाइन चरण और $map . का उपयोग और $filter $project . में पाइपलाइन चरण:

Aggregation aggregation = newAggregation(
  match(
    Criteria.where("name").is("race").and("polaire").elemMatch(
      Criteria.where("voile").is("foc")
        .and("matrice").elemMatch(
          Criteria.where("vitRange.min").lt(5)
            .and("vitRange.max").gt(5)
            .and("twaRange.min").lt(32)
            .and("twaRange.max").gt(32)
        )
    )
  ),
  project("name")
    .and(new AggregationExpression() {
      @Override
      public DBObject toDbObject(AggregationOperationContext context) {
        return new BasicDBObject("$map",
          new BasicDBObject("input",new BasicDBObject(
            "$filter", new BasicDBObject(
              "input", "$polaire")
              .append("as","p")
              .append("cond", new BasicDBObject("$eq", Arrays.asList("$$p.voile","foc")))
          ))
          .append("as","p")
          .append("in", new BasicDBObject(
            "voile", "$$p.voile")
            .append("matrice",new BasicDBObject(
              "$filter", new BasicDBObject(
                "input", "$$p.matrice")
                .append("as","m")
                .append("cond", new BasicDBObject(
                  "$and", Arrays.asList(
                    new BasicDBObject("$lt", Arrays.asList("$$m.vitRange.min", 5)),
                    new BasicDBObject("$gt", Arrays.asList("$$m.vitRange.max", 5)),
                    new BasicDBObject("$lt", Arrays.asList("$$m.twaRange.min", 32)),
                    new BasicDBObject("$gt", Arrays.asList("$$m.twaRange.max", 32))
                  )
                ))
            ))
          )
        );
      }
    }).as("polaire")
);

जो इस क्रमांकन का अनुवाद करता है:

[
  { "$match": {
    "name": "race",
    "polaire": {
      "$elemMatch": {
        "voile": "foc",
        "matrice": {
          "$elemMatch": {
            "vitRange.min": { "$lt": 5 },
            "vitRange.max": { "$gt": 5 },
            "twaRange.min": { "$lt": 32 },
            "twaRange.max": { "$gt": 32 }
          }
        }
      }
    }
  }},
  { "$project": {
    "name": 1,
    "polaire": {
       "$map": {
         "input": {
           "$filter": {
             "input": "$polaire",
             "as": "p",
             "cond": { "$eq": [ "$$p.voile", "foc" ] }
           } 
         },
         "as": "p",
         "in": {
           "voile": "$$p.voile",
           "matrice": {
             "$filter": {
               "input": "$$p.matrice",
               "as": "m",
               "cond": {
                 "$and": [
                   { "$lt": [ "$$m.vitRange.min", 5 ] },
                   { "$gt": [ "$$m.vitRange.max", 5 ] },
                   { "$lt": [ "$$m.twaRange.min", 32 ] },
                   { "$gt": [ "$$m.twaRange.max", 32 ] }
                 ]
               }
             }
           }
         }
       }
     }
  }}
]

और मिलान किए गए दस्तावेज़ आउटपुट को इस रूप में प्रस्तुत करता है:

{
    "_id" : ObjectId("593bc2f15924d4206cc6e399"),
    "name" : "race",
    "polaire" : [
        {
            "voile" : "foc",
            "matrice" : [
                    {
                            "vitRange" : {
                                    "min" : 4,
                                    "max" : 6
                            },
                            "twaRange" : {
                                    "min" : 30,
                                    "max" : 33
                            },
                            "values" : [
                                    0,
                                    0,
                                    2.4,
                                    3.7
                            ]
                    }
            ]
        }
    ]
}

$match . का "क्वेरी" भाग वास्तव में "दस्तावेज़ों" का चयन करना महत्वपूर्ण है जो शर्तों को पूरा करते हैं। $elemMatch . के उपयोग के बिना अभिव्यक्ति वास्तव में एक ही आंतरिक तत्वों पर सही परिस्थितियों के बिना दस्तावेज़ों से मेल खा सकती है और वास्तव में दस्तावेज़ में मौजूद सभी सरणी तत्वों में फैल जाएगी।

पहले नेस्टेड सरणी को फ़िल्टर करने से $map . का उपयोग होता है चूंकि "आंतरिक" सरणी तत्व भी अपने "फ़िल्टरिंग" के अधीन होने जा रहा है। तो दोनों "input" $map . के लिए स्रोत साथ ही "आउटपुट" के रूप में "in" $filter . का संदर्भ लें सरणियों के विशिष्ट तत्वों से मेल खाने के लिए शर्तें।

"शर्तों" के रूप में ( "cond" ) से $filter हम "तार्किक एकत्रीकरण अभिव्यक्तियों" का उपयोग करते हैं जैसे कि बूलियन $and साथ ही अन्य "तुलना ऑपरेटरों" को उनके "क्वेरी ऑपरेटर" समकक्षों की समान स्थितियों की नकल करने के लिए। ये उस तर्क के लिए ज़िम्मेदार हैं जो "फ़िल्टर किए गए" परिणाम में लौटने के लिए सही सरणी आइटम से मेल खाता है।

संदर्भ के लिए यह स्रोत डेटा है जिससे परिणाम प्राप्त होते हैं जो प्रश्न में पोस्ट किए गए समान होना चाहिए:

{
        "_id" : ObjectId("593bc2f15924d4206cc6e399"),
        "name" : "race",
        "polaire" : [
                {
                        "voile" : "foc",
                        "matrice" : [
                                {
                                        "vitRange" : {
                                                "min" : 0,
                                                "max" : 4
                                        },
                                        "twaRange" : {
                                                "min" : 0,
                                                "max" : 30
                                        },
                                        "values" : [
                                                0,
                                                0,
                                                0,
                                                2.4
                                        ]
                                },
                                {
                                        "vitRange" : {
                                                "min" : 4,
                                                "max" : 6
                                        },
                                        "twaRange" : {
                                                "min" : 30,
                                                "max" : 33
                                        },
                                        "values" : [
                                                0,
                                                0,
                                                2.4,
                                                3.7
                                        ]
                                }
                        ]
                },
                {
                        "voile" : "spi",
                        "matrice" : [
                                {
                                        "vitRange" : {
                                                "min" : 0,
                                                "max" : 4
                                        },
                                        "twaRange" : {
                                                "min" : 0,
                                                "max" : 30
                                        },
                                        "values" : [
                                                0,
                                                0,
                                                0,
                                                1.4
                                        ]
                                },
                                {
                                        "vitRange" : {
                                                "min" : 4,
                                                "max" : 6
                                        },
                                        "twaRange" : {
                                                "min" : 30,
                                                "max" : 33
                                        },
                                        "values" : [
                                                0,
                                                0,
                                                1.4,
                                                2.2
                                        ]
                                }
                        ]
                }
        ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB दस्तावेज़ को अनमर्शलिंग करते समय नल को कैसे अनदेखा करें?

  2. अपने क्लाउड डेटाबेस को प्रबंधित करने के लिए AWS पर ClusterControl को कैसे परिनियोजित करें

  3. JSON फ़ाइल का Mongoimport

  4. एक MongoDB दस्तावेज़ में अप्सर्ट ऐरे तत्व मिलान मानदंड?

  5. उल्का या नोड में थोक मोंगोडब डालें