और Mongoose में दो या प्रश्नों को मिलाएं


92

मैं इस SQL ​​स्टेटमेंट की तरह और मोनो के साथ दो OR- क्वेरीज़ को जोड़ना चाहता हूं:

SELECT * FROM ... WHERE (a = 1 OR b = 1) AND (c=1 OR d=1)

मैंने NodeJS मॉड्यूल में यह कोशिश की, जो केवल मुख्य एप्लिकेशन से मॉडल ऑब्जेक्ट प्राप्त करता है:

/********** Main application ***********/
var query = MyModel.find({});
myModule1.addCondition(query);
myModule2.addCondition(query);
query.exec(...)

/************ myModule1 ***************/
exports.addCondition = function(query) {
  query.or({a: 1}, {b: 1});
}

/************ myModule2 ***************/
exports.addCondition = function(query) {
  query.or({c: 1}, {d: 1});
}

लेकिन यह काम नहीं करता है, इस SQL ​​कथन की तरह सभी OR-conditions एक साथ जुड़ जाएंगे:

SELECT * FROM ... WHERE a = 1 OR b = 1 OR c=1 OR d=1

मैं और मोंगोसे में myModule1और के myModule2साथ दो स्थितियों को कैसे जोड़ सकता हूं ?


1
टाइपो: query.or({a: 1}, {b: 1});कुछ इस तरह होना चाहिए query.or([{a: 1}, {b: 1}]);आदि
Sonson123

जवाबों:


203

संभवतः अपनी क्वेरी ऑब्जेक्ट सीधे बनाना आसान है:

  Test.find({
      $and: [
          { $or: [{a: 1}, {b: 1}] },
          { $or: [{c: 1}, {d: 1}] }
      ]
  }, function (err, results) {
      ...
  }

लेकिन आप Query#andहाल के 3.x Mongoose रिलीज़ में उपलब्ध सहायक का भी उपयोग कर सकते हैं :

  Test.find()
      .and([
          { $or: [{a: 1}, {b: 1}] },
          { $or: [{c: 1}, {d: 1}] }
      ])
      .exec(function (err, results) {
          ...
      });

क्या $ या कथन में खोजने का कोई तरीका है जो स्थिति ने काम किया (संतुष्ट)। @ जोंहनी
विशाला


2
मुझे लगता है कि आप $ की आवश्यकता के बिना $ या सीधे उपयोग कर सकते हैं और
हिशम

हाँ! जैसा कि हिशम ने कहा कि इसे '$' के बिना काम करना चाहिए और 'मानगो' प्रत्येक कॉमा को '$ और' के रूप में लेता है। क्या कोई यह कह सकता है?
अर्नव सिंह

3
आपको $andयहां उपयोग करने की आवश्यकता है क्योंकि आपके पास एक ही नाम ( $or) के ऑब्जेक्ट में दो फ़ील्ड नहीं हो सकते हैं ।
जॉनीएचके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.