2017-05-10 15 views
8

मान लीजिए मैं निम्नलिखित प्रश्न हैं:मोंगोस अगर स्थिति के साथ एक प्रश्न कैसे लिखें?

post.getSpecificDateRangeJobs = function(queryData, callback) { 
var matchCriteria = queryData.matchCriteria; 
var currentDate = new Date(); 
var match = { expireDate: { $gte: new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()) } }; 
if (queryData.matchCriteria !== "") { 
    match = { 
    expireDate: { $gte: new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()) }, 
    $text: { $search: matchCriteria } 
    }; 
} 
var pipeline = [ 
    { 
    $match: match 
    }, 
    { 
    $group: { 
     _id: null, 
     thirtyHourAgo: { 
     $sum: { 
      $cond: [ 
      { 
       $gte: [ 
       "$publishDate", 
       new Date(queryData.dateGroups.thirtyHourAgo) 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     fourtyEightHourAgo: { 
     $sum: { 
      $cond: [ 
      { 
       $gte: [ 
       "$publishDate", 
       new Date(queryData.dateGroups.fourtyHourAgo) 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     }, 
     thirtyDaysAgo: { 
     $sum: { 
      $cond: [ 
      { 
       $lte: [ 
       "$publishDate", 
       new Date(queryData.dateGroups.oneMonthAgo) 
       ] 
      }, 
      1, 
      0 
      ] 
     } 
     } 
    } 
    } 
]; 
var postsCollection = post.getDataSource().connector.collection(
    post.modelName 
); 
postsCollection.aggregate(pipeline, function(err, groupByRecords) { 
    if (err) { 
    return callback("err"); 
    } 
    return callback(null, groupByRecords); 
}); 
}; 

क्या मैं करना चाहता हूँ है: 1- जांच अगर queryData.dateGroups.thirtyHourAgo ही अस्तित्व में है और मूल्य नहीं है, तो केवल क्वेरी में प्रासंगिक मैच खंड (पदों की संख्या केवल अतीत के लिए जोड़ने 30 घंटे)। 2- जांचें कि queryData.dateGroups.fourtyHourAgo मौजूद है, तो प्रासंगिक क्वेरी अनुभाग जोड़ें (पिछले 30 घंटों के लिए पदों की गिनती, और पिछले 48 घंटे पहले)। 3 और queryData.dateGroups.oneMonthAgo के लिए वही (पिछले 30 घंटे, 48 घंटे, और पिछले एक महीने के लिए पदों की गणना)।

मुझे माइस्क्ल की तरह कुछ चाहिए यदि यह जांचने की स्थिति है कि एक चर मौजूद है या नहीं खाली है तो एक क्वेरी क्लॉज शामिल करें। क्या यह करना मुमकिन है?

मेरे नमूना डेटा की तरह है:

/* 1 */ 
{ 
"_id" : ObjectId("58d8bcf01caf4ebddb842855"), 
"vacancyNumber" : "123213", 
"position" : "dsfdasf", 
"number" : 3, 
"isPublished" : true, 
"publishDate" : ISODate("2017-03-11T00:00:00.000Z"), 
"expireDate" : ISODate("2017-05-10T00:00:00.000Z"), 
"keywords" : [ 
    "dasfdsaf", 
    "afdas", 
    "fdasf", 
    "dafd" 
], 
"deleted" : false 
} 

/* 2 */ 
{ 
"_id" : ObjectId("58e87ed516b51f33ded59eb3"), 
"vacancyNumber" : "213123", 
"position" : "Software Developer", 
"number" : 4, 
"isPublished" : true, 
"publishDate" : ISODate("2017-04-14T00:00:00.000Z"), 
"expireDate" : ISODate("2017-05-09T00:00:00.000Z"), 
"keywords" : [ 
    "adfsadf", 
    "dasfdsaf" 
], 
"deleted" : false 
} 

/* 3 */ 
{ 
"_id" : ObjectId("58eb5b01c21fbad780bc74b6"), 
"vacancyNumber" : "2432432", 
"position" : "Web Designer", 
"number" : 4, 
"isPublished" : true, 
"publishDate" : ISODate("2017-04-09T00:00:00.000Z"), 
"expireDate" : ISODate("2017-05-12T00:00:00.000Z"), 
"keywords" : [ 
    "adsaf", 
    "das", 
    "fdafdas", 
    "fdas" 
], 
"deleted" : false 
} 

/* 4 */ 
{ 
"_id" : ObjectId("590f04fbf97a5803636ec66b"), 
"vacancyNumber" : "4354", 
"position" : "Software Developer", 
"number" : 5, 
"isPublished" : true, 
"publishDate" : ISODate("2017-05-19T00:00:00.000Z"), 
"expireDate" : ISODate("2017-05-27T00:00:00.000Z"), 
"keywords" : [ 
    "PHP", 
    "MySql" 
], 
"deleted" : false 
} 

मान लीजिए मैं अपने आवेदन इंटरफ़ेस में तीन लिंक है: 1- 30 घंटे पहले पोस्ट नहीं। 2- 48 घंटे पूर्व पोस्ट। 3- पिछले एक महीने की पोस्ट।

अब यदि उपयोगकर्ता पहले लिंक पर क्लिक करता है तो मुझे केवल 30 घंटे पहले समूह पदों पर नियंत्रण करना चाहिए, लेकिन यदि उपयोगकर्ता दूसरे लिंक पर क्लिक करता है, तो मुझे 30 घंटे के लिए और 48 घंटे के लिए समूह पदों पर अपनी क्वेरी तैयार करनी चाहिए, और यदि उपयोगकर्ता तीसरे लिंक पर क्लिक करें मुझे उन सभी के लिए तैयार करना चाहिए।

var pipeline = [ 
    { 
    $match: match 
    }, 
    { 
    $group: { 
     _id: null, 
     if (myVariable) { 
     thirtyHourAgo: { 
      ........ 
      ........ 
     } 
     } 
     if (mysecondVariable) { 
     fortyEightHourAgo: { 
      ........ 
      ........ 
     } 
     } 
+0

की तरह कुछ आप नमूने के साथ परीक्षण करने के लिए और डेटा है कि नमूना से अपेक्षित आउटपुट पोस्ट कर सकते हैं होगा? आम तौर पर समेकन ढांचे का उपयोग करने से संबंधित समस्याओं के समाधान अपेक्षित आउटपुट से अनुमानित होते हैं, इसलिए यदि आप आईओ (इनपुट -> आउटपुट) डेटा प्रदान कर सकते हैं तो यह आपको हल करने में मदद करने के साथ एक लंबा रास्ता तय करेगा। – chridam

+0

@ चिड़ियाम मैंने अपना प्रश्न अपडेट किया है, आशा है कि यह पर्याप्त स्पष्ट है। – jones

उत्तर

7

आप अपने क्वेरी पैरामीटर के आधार पर जेसन दस्तावेज़ को गतिशील रूप से बनाने के लिए जावास्क्रिप्ट का उपयोग कर सकते हैं।

आपका अपडेट किया गया समारोह देखने के

post.getSpecificDateRangeJobs = function(queryData, callback) { 

    var matchCriteria = queryData.matchCriteria; 
    var currentDate = new Date(); 

    // match document 
    var match = { 
    "expireDate": { 
     "$gte": currentDate 
    } 
    }; 

    if (matchCriteria !== "") { 
    match["$text"]: { 
     "$search": matchCriteria 
    } 
    }; 

    // group document 
    var group = { 
    _id: null 
    }; 

    // Logic to calculate hours difference between current date and publish date is less than 30 hours. 

    if (queryData.dateGroups.thirtyHourAgo) { 
    group["thirtyHourAgo"] = { 
     "$sum": { 
     "$cond": [{ 
      "$lte": [{ 
       "$divide": [{ 
       "$subtract": [currentDate, "$publishDate"] 
       }, 1000 * 60 * 60] 
      }, 30] 
      }, 
      1, 
      0 
     ] 
     } 
    }; 
    } 

    // Similarly add more grouping condition based on query params. 

    var postsCollection = post.getDataSource().connector.collection(
    post.modelName 
); 

    // Use aggregate builder to create aggregation pipeline. 

    postsCollection.aggregate() 
    .match(match) 
    .group(group) 
    .exec(function(err, groupByRecords) { 
     if (err) { 
     return callback("err"); 
     } 
     return callback(null, groupByRecords); 
    }); 

}; 
1

के रूप में मैं समझ गया, मैं तुम्हें सामान्य क्वेरी निम्नलिखित सुझाव कर सकते हैं:

मैं की तरह कुछ करना चाहते हैं। अपनी जरूरत के हिसाब से इसे संशोधित करें।

db.getCollection('vacancy') 
.aggregate([{$match: { $and: [ 
{publishDate:{ $gte: new Date(2017, 4, 13) }} , 
{publishDate:{ $lte: new Date(2017, 4, 14) }} 
]} }]) 

सारांश:

  • प्रयुक्त परिणाम को फ़िल्टर करने के मैच।
  • हम एकत्रीकरण पाइपलाइन का उपयोग कर रहे हैं ताकि आप अधिक कुल ऑपरेटरों एन पाइपलाइन
  • जोड़ सकते हैं $ का उपयोग करना और एक तार्किक करते हैं और कहते हैं कि 1 दिन, 2 दिन या 1 महीने क्योंकि हम एक दे रेंज के बीच कुछ दस्तावेज लाने के लिए चाहते हैं (अपनी आवश्यकता के अनुसार दिनांक पैरामीटर बदलें)
संबंधित मुद्दे