соответствовать всем, если пользователь не указывает значение поля MongoDB - PullRequest
1 голос
/ 08 марта 2020

Я создаю API, где у меня есть несколько полей, которые являются необязательными в моем запросе get. Поэтому я хочу, чтобы MongoDB соответствовал всем значениям для этих необязательных полей, если пользователь не указал их. Я пришел к этому решению:

db.collection(expenses_collection).find(username: username, category: {$regex:"/" + category + "/"}, payment_type: {$regex:"/" + payment_type + "/"}})

Если пользователь не указал категорию и payment_type, я установил их в ". *":

const {category=".*", payment_type=".*"} = req.query;

Однако mongodb по-прежнему не соответствует ни одному из данных. Любая помощь приветствуется. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Проблема связана с вашей строкой регулярных выражений. Чтобы соответствовать любому строковому значению, вы должны использовать этот шаблон (соответствует любой строке): (.*?)

Рассмотреть входные документы:

{ _id: 1, name: "John", category: "cat 1", payment_type: "cash" },
{ _id: 2, name: "Jane", category: "cat 2", payment_type: "credit card" }

Использование для сопоставления с любым значением поля category :

let categoryStr = /(.*?)/
db.exp.find( { category: categoryStr } )

Запрос возвращает все документы.

Итак, в вашем приложении для значения category, не указанного, код может выглядеть следующим образом:

if (category is empty or null) { // category  not specified by user
   categoryStr = /(.*?)/
}

Точно так же и для поля payment_type.

Тогда запрос будет выглядеть следующим образом:

db.exp.find( { 
  username: usernameStr, 
  category: categoryStr,  
  payment_type: paymentStr
} )


ПРИМЕЧАНИЕ. Код хорошо тестируется с API-интерфейсами драйвера MongoDB NodeJS.

1 голос
/ 08 марта 2020

Разве это не то, для чего существует ?

{category: { $exists: true }, payment_type: { $exists: true }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...