2014-06-30 8 views
6

मैं मौसम में एक परियोजना के लिए एक खोज प्रणाली कर रहा हूं और दो तिथियों के बीच खोजने के लिए एक फ़ील्ड लगाने की जरूरत है। हालांकि, दिनांक MongoDB में सरणी के भीतर हैं:मौसम में खोज दिनांक सीमा

"relatorios" : [ 
    { 
     "mes" : ISODate("2013-11-01T02:00:00Z"), 
     "revistas" : "2", 
     "brochuras" : "2", 
     "livros" : "0", 
     "folhetos" : "0", 
     "revisitas" : "0", 
     "estudos" : "0", 
     "horas" : "12" 
    }, 
    { 
     "mes" : ISODate("2013-09-01T03:00:00Z"), 
     "revistas" : "0", 
     "brochuras" : "0", 
     "livros" : "0", 
     "folhetos" : "0", 
     "revisitas" : "0", 
     "estudos" : "0", 
     "horas" : "12" 
    } 
] 

मैं मोंगो द्वारा सीधे छानने दिनांकों को क्वेरी करने की कोशिश की है, लेकिन नहीं कर सके। मैंने उल्का में MapReduce का उपयोग करने के बारे में कुछ मंचों पर पढ़ा। सबसे अच्छा विकल्प क्या है? और यदि संभव हो, तो मैं कैसे कर सकता हूं?

+0

आप अपने प्रश्न को स्पष्ट कर सकते हैं? मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। – JohnnyHK

+0

मुझे मेटियर द्वारा उप-दस्तावेज़ मोंगो में तिथियों के लिए एक प्रश्न करने की आवश्यकता है। –

उत्तर

11

आप ए और बी

var start = new Date(450000); 
var end = new Date(5450000000000); 

CollectionName.find({ 'relatorios.mes' : { $gte : start, $lt: end }); 

के बीच दो तिथियों के लिए डॉट नोटेशन, उदा, उपयोग कर सकते हैं तो यह जो एक सरणी जो इस क्षेत्र का मिलान करने का सभी दस्तावेजों मिलेगा। याद रखें mongodb दस्तावेजों को निष्कर्ष निकालें, इसलिए यदि आपके पास सिर्फ एक सरणी है जो इससे मेल खाती है तो आपको पूरा दस्तावेज़ मिल जाएगा।

+1

मैंने इसे इस तरह से किया, लेकिन मोंगो ने सरणी के सभी तत्वों को वापस कर दिया और न कि तिथियां क्या थीं। कोई तरीका नहीं है कि वह केवल उन तत्वों को लौटाता है जो क्वेरी से मेल खाते हैं? या मैं उल्का केवल उन तत्वों को कैसे प्राप्त करूं जो मेल खाते हैं? –

+0

मुझे मिल गया! मैं उन तत्वों को हटा रहा हूं जो प्रत्यक्ष उल्का में तारीख से मेल नहीं खाते हैं। धन्यवाद! –

0

आप $elemMatch उपयोग कर सकते हैं एक सारिणी का relatorios तत्व दो तिथियों के बीच एक mes मूल्य होता है, और $ को स्थितीय प्रक्षेपण ऑपरेटर को खोजने के लिए केवल शामिल है कि उत्पादन में तत्व मिलान।

खोल में:

start = new Date('2013-11-01T01:30:00Z'); 
end = new Date('2013-11-01T02:30:00Z'); 
db.test.find(
    {relatorios: {$elemMatch: {mes: {$gt: start, $lt: end}}}}, 
    {'relatorios.$': 1}) 

आप $elemMatch उपयोग नहीं करते हैं तो यह एक तत्व और एक अन्य के खिलाफ $lt के खिलाफ $gt मेल खा सकते हैं।

या यदि आप तिथि सीमा (सिर्फ पहली के बजाय) में सभीrelatorios तत्वों प्राप्त करने की आवश्यकता है, तो आप aggregate उपयोग कर सकते हैं:

db.test.aggregate([ 
    // Get all docs with at least one element in the date range 
    {$match: {relatorios: {$elemMatch: {mes: {$gt: start, $lt: end}}}}}, 
    // Duplicate each doc, once per relatorios element. 
    {$unwind: '$relatorios'}, 
    // Filter those to just the ones in the date range. 
    {$match: {'relatorios.mes': {$gt: start, $lt: end}}} 
]) 
+0

जो मुझे पता है, से मीटरी कुल –

+0

@MuriloVenturoso का समर्थन नहीं करता है इसके लिए कामकाज दिखाई देता है: http://stackoverflow.com/a/18884223/1259510 – JohnnyHK

+0

मैं आपके द्वारा पारित कोड चला रहा हूं, लेकिन उल्का लौटाता है निम्न त्रुटि: ऑब्जेक्ट [ऑब्जेक्ट ऑब्जेक्ट] में कोई विधि 'कुल' –

0
let date = new Date(); 
    let getFirstDay = new Date(date.getFullYear(), date.getMonth() + 1, 1); 
    let getLastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0); 

    let firstDay = getFirstDay.getFullYear() + '-' + ((''+getFirstDay.getMonth()).length<2 ? '0' : '') + getFirstDay.getMonth() + '-' + ((''+getFirstDay.getDate()).length<2 ? '0' : '') + getFirstDay.getDate()+"T00:00:00.000Z"; 
    let lastDay = getLastDay.getFullYear() + '-' + ((''+getLastDay.getMonth()).length<2 ? '0' : '') + (getLastDay.getMonth()+1) + '-' + ((''+getLastDay.getDate()).length<2 ? '0' : '') + getLastDay.getDate()+"T00:00:00.000Z"; 

var pipeline = [ 
     { 
      $match: { headofficeId: headofficeId }}, 
      { $match: {'createdDate': {$gt: new Date(firstDay), $lt: new Date(lastDay)}}}, 
      {$group: {_id: "$branchId", total: {$sum: "$actualValue"}}}, 
      { $sort: { total: -1 } 
     } 
    ]; 
var result = Commissions.aggregate(pipeline); 
return result; 
+0

यह आपके कोड से मेल नहीं खाता है। लेकिन यह एक वोकिंग कोड है जिसे आप अपनी जरूरत के अनुसार उपयोग कर सकते हैं –

संबंधित मुद्दे