मैप रिड्यूस आपको नामित कुंजियों को संसाधित करने की अनुमति देता है, लेकिन कुशल प्रश्नों के लिए एकत्रीकरण एक तरीका है।
आपको डेटा को एकत्रीकरण ढांचे के लिए एम्बेडेड दस्तावेज़ों की सरणी के रूप में मॉडल करना होगा।
मैंने आपको दो विकल्प दिए हैं। आप अपने डेटासेट के लिए उनका परीक्षण कर सकते हैं और देख सकते हैं कि कौन सा आपके लिए बेहतर काम करता है।
कुछ इस तरह
"v":[
{
"minute":1,
"seconds":[
{
"second":54,
"data":{
"field1":7.373158,
"entry_id":4635,
"field3":0.19,
"field2":88
}
}
]
},
{
"minute":2,
"seconds":...
}
]
अब आप उन वस्तुओं के लिए आसानी से क्वेरी कर सकते हैं जिनमें सेंसर रीडिंग है:"फ़ील्ड 1"> 2।
db.col.aggregate(
[{"$match":{"v.seconds.data.field1":{"$gt":2}}},
{"$unwind":"$v"},
{"$match":{"v.seconds.data.field1":{"$gt":2}}},
{"$unwind":"$v.seconds"},
{"$match":{"v.seconds.data.field1":{"$gt":2}}},
{"$project":{"data":"$v.seconds.data"}}]
)
वैकल्पिक रूप से, आप दस्तावेज़ों को मिनटों में विभाजित कर सकते हैं। कुछ इस तरह
"v":[
{
"second":1,
"data":{
"field1":7.373158,
"entry_id":4635,
"field3":0.19,
"field2":88
}
},
{
"second":2,
"data":...
}
]
अब आप क्वेरी कर सकते हैं जैसे (v.data.field1 पर अनुक्रमणिका के साथ)
db.col.aggregate(
[{"$match":{"v.data.field1":{"$gt":2}}},
{"$unwind":"$v"},
{"$match":{"v.data.field1":{"$gt":2}}},
{"$project":{"data":"$v.data"}}]
)
आप उन आइटम को क्वेरी कर सकते हैं जिनमें सेंसर रीडिंग है:"field1">2 और "field3">5
पहली संरचना का उपयोग करना
db.col.aggregate(
[{"$match":{"v":{"$elemMatch":{"seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}}}},
{"$unwind":"$v"},
{"$match":{"v.seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
{"$unwind":"$v.seconds"},
{"$project":{"data":"$v.seconds.data"}}]
)
दूसरी संरचना का उपयोग करना
db.col.aggregate(
[{"$match":{"v.data":{$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
{"$unwind":"$v"},
{"$match":{"v.data.field1":{"$gt":2},"v.data.field3":{"$gt":5} }},
{"$project":{"data":"$v.data"}}]
)
मोंगो अपडेट 3.6
$match
$expr
. के साथ जो एकत्रीकरण अभिव्यक्ति को स्वीकार करता है।
$gt > 0
- एग्रीगेशन एक्सप्रेशन यह जांचने के लिए कि एक मिनट में सभी मिलान सेकंड मानदंड का योग 0 से अधिक कहां है
$objectToArray
नामित कुंजियों को कुंजी मान युग्म में बदलने के लिए उसके बाद $filter
इनपुट मानदंड पर सेकंड और मिलान सेकंड रिकॉर्ड की आउटपुट संख्या।
db.testcol.aggregate(
{"$match":{
"$expr":{
"$gt":[
{"$sum":{
"$map":{
"input":{"$objectToArray":"$v"},
"as":"secondsofminute",
"in":{
"$size":{
"$filter":{
"input":{"$objectToArray":"$$secondsofminute.v"},
"as":"seconds",
"cond":{"$gt":["$$seconds.v.field2",2]}
}
}
}
}
}},
0]
}
}})
मोंगो अपडेट 3.4 - बदलें $expr
$redact
. के साथ
db.col.aggregate(
{"$redact":{
"$cond":{
"if":{
"$gt":[
{"$sum":{
"$map":{
"input":{"$objectToArray":"$v"},
"as":"secondsofminute",
"in":{
"$size":{
"$filter":{
"input":{"$objectToArray":"$$secondsofminute.v"},
"as":"seconds",
"cond":{"$gt":["$$seconds.v.field2",2]}
}
}
}
}
}},
0]
},
"then":"$$KEEP",
"else":"$$PRUNE"
}
}})