Kết hợp hai truy vấn OR với AND trong Mongoose


92

Tôi muốn kết hợp hai truy vấn OR với AND trong Monoose, giống như trong câu lệnh SQL này:

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

Tôi đã thử điều này trong một mô-đun NodeJS chỉ lấy đối tượng mô hình từ ứng dụng chính:

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

Nhưng điều này không hoạt động, tất cả các điều kiện OR sẽ được kết hợp với nhau như trong câu lệnh SQL này:

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

Làm cách nào để kết hợp hai điều kiện của myModule1myModule2với AND trong Mongoose?


1
Typo: query.or({a: 1}, {b: 1});nên một cái gì đó giống như query.or([{a: 1}, {b: 1}]);, vv
Sonson123

Câu trả lời:


203

Có thể dễ dàng nhất để tạo đối tượng truy vấn của bạn trực tiếp như:

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

Nhưng bạn cũng có thể sử dụng trình Query#andtrợ giúp có sẵn trong các bản phát hành Mongoose 3.x gần đây:

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

Có cách nào để tìm trong $ hoặc câu lệnh mà điều kiện hoạt động (thỏa mãn). @johnnyHK
VishAl


2
tôi nghĩ rằng bạn có thể sử dụng $ hoặc trực tiếp mà không cần và $
Hisham

vâng! như Hisham đã nói rằng nó sẽ hoạt động mà không có '$ và' mongoose nhận mọi dấu phẩy là '$ và'. ai đó có thể nói nó không?
Arnav Singh

3
Bạn cần sử dụng $andở đây vì bạn không thể có hai trường trong một đối tượng có cùng tên (of $or).
JohnnyHK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.