#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 есть какой-то синтаксис / концепция для этого сценария, который я не знаю. В любом случае это работает. Спасибо. Я надеюсь, что есть какой-то способ отметить вас в моих будущих вопросах.