流星.js&mongoDB-具有多个字段的查询

meteor.js & mongoDB - query with multiple fields

本文关键字:字段 查询 js amp mongoDB- 流星      更新时间:2023-09-26

上下文

我正在尝试创建一个搜索功能,允许用户填写多个字段、提交并查看一个集合中匹配项目的列表。我在前端使用一个表单来完成这项工作,它更新后端的会话变量,然后将这些变量作为查询传递给mongodb集合。

它应该如何工作

如果用户提交了场地大小,则会显示该大小的场地。如果只键入了一个位置,则会显示该位置内的场地。如果同时提交了大小和位置,则会显示符合这两个标准的场馆。

它的实际工作方式

如果没有填写任何内容,则按search将生成集合中的所有项目。同时提交位置和大小可以产生符合这两个标准的场地。但是,只填充一个字段,而将另一个字段留空,则不会在结果中产生任何结果。我想知道为什么会这样——这几乎就像查询在搜索一个实际上包含"的字段。。。但是,当两个字段都为空时,为什么我看不到这种行为呢?非常感谢您的帮助!

代码SNIPET

//Search Form Helper
Template.managevenues.helpers({
  venue: function () {
    var venueNameVar = Session.get('venueNameVar');
    var venueLocationVar = Session.get('venueLocationVar');
    if(venueNameVar || venueLocationVar){
        console.log(venueNameVar);
        console.log(venueLocationVar);
        return Venues.find({
            venueName: venueNameVar,
            'venueAddress.neighbourhood': venueLocationVar
    });
    } else {
        return Venues.find({});
    }
});

答案在于您的查询

Venues.find({
        venueName: venueNameVar,
        'venueAddress.neighbourhood': venueLocationVar
});

如果你没有vars集,它会是这样的。。。

{
   venueName: undefined,
   'venueAddress.neighbourhood':'someVal'
}

因此,它可以匹配任何没有名字且位于某个社区的场地。

更好的方法是,只有在有值要搜索的情况下才设置查询条件。。。

var query = {};
if(Session.get('venueNameVar')) {
   query.venueName = Session.get('venueNameVar');
}
if(Session.get('venueLocationVar') {
   query.venueAddress = {
       neighbourhood : Session.get('venueLocationVar');
   }
}
return Venues.find(query);

我认为这会对你更好!