आप सही रास्ते पर हैं, लेकिन यहां कुछ चीजें ध्यान देने योग्य हैं, उस हिस्से से अलग जो नेस्टेड सरणियों (और विशेष रूप से अनाम कुंजियों के साथ) चीजों को स्टोर करने का एक शानदार तरीका नहीं है, लेकिन जब तक आप लगातार स्थिति को जानते हैं यह उचित रूप से ठीक होना चाहिए।
दस्तावेज़ों matching के मिलान के बीच एक अलग अंतर है और मिलान "एक सरणी के तत्व" . हालांकि आपका वर्तमान मूल्य वास्तव में मेल नहीं खाएगा (आपका खोज मूल्य दस्तावेज़ की सीमा के भीतर नहीं है), यदि मान वास्तव में मान्य था तो आपकी क्वेरी "दस्तावेज़" से सही ढंग से मेल खाती है यहाँ, जिसमें सरणी में एक मेल खाने वाला तत्व है।
"दस्तावेज़" इसमें सभी शामिल हैं सरणी तत्वों में से, यहां तक कि वे जो मेल नहीं खाते, लेकिन शर्त कहती है "दस्तावेज़" मेल खाता है, इसलिए इसे वापस कर दिया जाता है। यदि आप केवल मिलान करना चाहते हैं "elements" फिर .aggregate()
. का इस्तेमाल करें इसके बजाय:
db.infos.aggregate([
// Still match the document
{ "$match": {
"info": {
"$elemMatch": { "0": {"$gte": 1399583285000} }
}
}},
// unwind the array for the matched documents
{ "$unwind": "$info" },
// Match only the elements
{ "$match": { "info.0": { "$gte": 1399583285000 } } },
// Group back to the original form if you want
{ "$group": {
"_id": "$_id",
"info": { "$push": "$info" }
}}
])
और वह केवल उन तत्वों को लौटाता है जो शर्त से मेल खाते हैं:
{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
या पाठ्यक्रम यदि आपने कभी केवल एक . की अपेक्षा की हो मिलान करने के लिए तत्व, तो आप बस . के साथ प्रक्षेपण का उपयोग कर सकते हैं .find()
**:
db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)
लेकिन $gt
. जैसे शब्द के साथ आपको एक दस्तावेज़ के भीतर कई हिट मिलने की संभावना है, इसलिए स्थितिगत $
को देखते हुए समग्र दृष्टिकोण सुरक्षित होने जा रहा है ऑपरेटर केवल पहले वापस करने जा रहा है मैच।