Как искать в документе MongoDB, используя несколько фильтров выбора из выпадающего списка? - PullRequest
1 голос
/ 13 мая 2019

У меня есть следующие примеры данных в коллекции под названием inventory:

{ "_id" : 1, "item" : "abc1", description: "product 1", status: "Low" }
{ "_id" : 2, "item" : "abc2", description: "product 2", status: "Medium" }
{ "_id" : 3, "item" : "xyz1", description: "product 3", status: "High" }

У меня также есть экран, который содержит три фильтра выпадающих списков выбора, которые используются для запроса вышеуказанного инвентаря,т.е.:

Item
Description
Status

Здесь пользователь может выбрать фильтрацию данных по всем трем раскрывающимся спискам, чтобы получить требуемый вывод данных отчета, или может просто выбрать один элемент, чтобы отфильтровать данные отчета.

Мой вопрос: как я могу выполнить требуемый запрос mongodb.find на основе выбранных значений из раскрывающихся списков, которые могут быть только одним выбором или даже только двумя?

Например, если пользователь выбирает следующеекомбинации и нажимает кнопку отправки, я ожидаю увидеть только этот документ:

Item = "abc2" selected by user
Description = no selection
Status = no selection

Код:

db.inventory.find(
  {
    "item" : "abc2",
    "description" : "",
    "status" : ""
  }
);

Поскольку я не уверен, какой выбор фильтра будет выполнен, мне нужнообслуживать все типы комбинаций.

Выбор только item возвращает мне 0 документов, так как он ожидает значения как для description, так и status, но на самом деле он должен возвращать мне oНе документ.

1 Ответ

1 голос
/ 13 мая 2019

Возможно, было бы лучше создать это условие в логике вашего приложения, но вы можете рассмотреть возможность создания запроса MongoDB, используя $ expr и $ cond , как показано ниже:

var query = {
    "item" : "abc2",
    "description" : "",
    "status" : ""
}

db.col.find({
    $expr: {
        $and: [
            { $cond: [ { $eq: [ query.item, "" ] }, true, { $eq: [ "$item", query.item ] } ] },
            { $cond: [ { $eq: [ query.description, "" ] }, true, { $eq: [ "$description", query.description ] } ] },
            { $cond: [ { $eq: [ query.status, "" ] }, true, { $eq: [ "$status", query.status ] } ] },
        ]
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...