Combina due query OR con AND in Mongoose


92

Voglio combinare due query OR con AND in Monoose, come in questa istruzione SQL:

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

Ho provato questo in un modulo NodeJS che ottiene solo l'oggetto modello dall'applicazione principale:

/********** 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});
}

Ma questo non funziona, tutte le condizioni OR verranno unite insieme come in questa istruzione SQL:

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

Come posso combinare le due condizioni di myModule1e myModule2con AND in Mongoose?


1
query.or({a: 1}, {b: 1});query.or([{a: 1}, {b: 1}]);
Errore di battitura

Risposte:


203

Probabilmente è più semplice creare il tuo oggetto query direttamente come:

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

Ma puoi anche usare l' Query#andhelper disponibile nelle recenti versioni di Mongoose 3.x:

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

C'è un modo per trovare in $ o un'istruzione quale condizione ha funzionato (soddisfatta). @johnnyHK
VishAl


2
Penso che tu possa usare $ o direttamente senza bisogno di $ e
Hisham

si! come ha detto Hisham, dovrebbe funzionare senza "$ e" mangusta prende ogni virgola come un "$ e". qualcuno può dire che lo fa?
Arnav Singh,

3
È necessario utilizzare $andqui perché non è possibile avere due campi in un oggetto con lo stesso nome (di $or).
JohnnyHK
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.