Поиск нескольких атрибутов в Монго с Метеором

1

Я смог реализовать метод публикации в Meteor, который запускает запрос к моей коллекции mongo через данный атрибут при подписке в template.js, который отлично работает, но теперь я хотел бы добавить поиск нескольких атрибутов в том же манера. Итак, скажем, у меня есть коллекция в Монго, где все документы имеют одинаковые атрибуты, но с разными значениями.

{batch:'HAHT020614' color: 'blue', material: 'plastic', printing: true, 
  model: 'H100', handle: 'plastic', product: 'C010' }
{batch:'HBTH060614' color: 'red', material: 'metal', printing: false, 
  model: 'V400', handle: 'metal', product: 'P001' }
...

Я пытаюсь отправить объект методу публикации, который содержит все поля, выбранные пользователем, через реактивные vars:

Template.inventory.onCreated( function appBodyOnCreated() {
    this.searchQuery = new ReactiveVar({
        color: anyItem,
        batch: anyItem,
        model: anyItem,
        material: anyItem,
        handle: anyItem,
        printing: anyItem,
        product: anyItem,
    });
    this.autorun(function () {
        let template = Template.instance();
        template.subscribe("stock.search", template.searchQuery.get());
    });
});

Затем в публикации.js:

Meteor.publish('stock.search', function stockQuery(search) {
  return Stock.find(
    { $and: [
      {color: { $regex : search.color }},
      {batch: { $regex : search.batch}},
      {product: { $regex : search.product}},
      {model: { $regex : search.model}},
      {material: { $regex : search.material}},
      {handle: { $regex : search.handle}},
      {printing: { $regex : search.printing}}
      ]
    }, 
    { limit: 10, sort: { batch: 1 } });
});

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

Объект правильно достигает метода публикации, и я могу извлечь атрибуты, но проблема остается в запросе, так как я не знаю, можно ли попросить Mongo сопоставить определенные атрибуты с "any". Я попытался передать {$ exists: true} в качестве поля по умолчанию (и при поле поиска пустым), чтобы он соответствовал любому из документов в коллекции, но запрос, похоже, не возвращается правильно. В этом случае я использую regex как нечто вроде "содержит", в то время как var anyItem - это просто пустая строка.

Есть ли надлежащий способ запросить манго, чтобы соответствовать только определенным атрибутам выбранным значениям, в то время как остальные остаются "любыми"?

Теги:
meteor

1 ответ

1
Лучший ответ

Вы можете передать только ненулевые критерии методу публикации и построить запрос только с заданными критериями:

Meteor.publish('stock.search', function stockQuery(search) {
   const criteria = Object.keys(search).map(k => ({ [k]: { $regex: search[k] } }));
   return Stock.find(
       { $and: criteria }, 
       { limit: 10, sort: { batch: 1 } }
   );
});
  • 0
    Мне пришлось немного изменить логику в том случае, если значение фиксируется, но с небольшой настройкой это сработало отлично! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню