Я смог реализовать метод публикации в 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.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 } }
);
});