मैं "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
]
}
]
}
]
}