как запросить MongoDB с массивом логических полей?

#node.js #mongodb #mongoose #mongodb-query

#node.js #mongodb #мангуст #mongodb-запрос

Вопрос:

Моя схема модели mongoose выглядит следующим образом —

 {
 email: { type: String},
 Date: {type: Date},
 isOnboarded: {type: Boolean},
 isVip: {type: Boolean},
 isAdult: {type: Boolean}
}
 

В моем интерфейсе у меня есть 3 флажка для параметров «isVip», «isOnboarded» и «isAdult». Если они отмечены, я добавляю их в массив, который я передам на сервер. Допустим, если будут проверены «isVip» и «isAdult», я передам [isVip, isAdult] в post api на сервер. Теперь, как я могу написать запрос, чтобы получить все документы с полями в массиве как true, т.е. в приведенном выше примере, как я могу получить все документы с помощью {isVip: true, isAdult:true}

У меня возникли проблемы, потому что значения массива постоянно меняются, это может быть только одно поле или 3 поля. Я не смог найти способ задать условие внутри запроса mongoose.

  User.find(
 { [req.query.array]: true},
 { projection: { _id: 0 } }
)
 

Пользователь — моя модель mongoose.
Я хочу что-то вроде этого (документы со значением ‘true’ для полей, указанных в массиве) и ‘req.query.array’ — это массив с именами полей, который я передал из интерфейса.

Ответ №1:

Вы должны создать свой объект в JS и передать его в mongo таким образом:

 var query = {}
if(isVip) query["isVip"] = true;
if(isOnboarded) query["isOnboarded"] = true;
if(isAdult) query["isAdult"] = true;
 

И затем вы можете использовать нужный вам метод mongoose, например:

 var found = await model.find(query)
 

И это вернет документ, соответствующий элементам.

Кроме того, обратите внимание, что это делается для создания и объекта, который будет прочитан запросом, поэтому вы можете использовать это в конвейере агрегации или во всем, что захотите

Проверьте вывод:

 var query = {}
query["isVip"] = true;
query["isOnboarded"] = true;
query["isAdult"] = true;
console.log(query) 

Это тот же объект, который используется для выполнения запроса здесь

 {
  "isVip": true,
  "isOnboarded": true,
  "isAdult": true
}
 

Кроме того, узнать, содержит ли ваше сообщение «isVip», «isOnboarded» или «isAdult», — это вопрос javascript, а не монго, но вы можете использовать что-то вроде этого (я предполагаю, что вы передаете массив строк):

 var apiArray = ["isVip","isAdult"]
var isVip = apiArray.includes("isVip")
var isAdult = apiArray.includes("isAdult")
var isOnboarded = apiArray.includes("isOnboarded")
console.log("isVip: " isVip)
console.log("isAdult: " isAdult)
console.log("isOnboarded: " isOnboarded) 

Комментарии:

1. Я не понял, что вы имели в виду под конвейером агрегации, но я предполагаю, что меня это не касается в этом сценарии? Также я просматривал ваш профиль SO, чтобы получить ваш социальный, чтобы я мог отправить вам этот вопрос. Я попробую этот объектный метод и свяжусь с вами.

2. Да, это подходит. Если вы используете User.find(query,{ projection: { _id: 0 } }) именно то, что вы хотите (я думаю). Я назвал «агрегацию» как append, чтобы сказать, что этот объект JS можно использовать в большем количестве сценариев, но он работает для вашей задачи.

3. Я новичок в mongoose, поэтому я подумал, что в mongo есть какой-то синтаксис / концепция для этого сценария, который я не знаю. В любом случае это работает. Спасибо. Я надеюсь, что есть какой-то способ отметить вас в моих будущих вопросах.