【问题标题】:meteor.js & mongoDB - query with multiple fieldsmeteor.js & mongoDB - 多字段查询
【发布时间】:2016-03-17 21:07:17
【问题描述】:

上下文

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

应该如何工作

如果用户提交场地尺寸,则显示该尺寸的场地。如果只输入了一个位置,则显示该位置内的场所。如果同时提交了大小和位置,则会显示符合这两个条件的场地。

它是如何工作的

如果没有填写任何内容,则按搜索会生成集合中的所有项目。提交位置和规模会产生符合这两个标准的场所。但是,仅填写一个字段并将其他字段留空不会产生任何结果。我想知道为什么会这样 - 就好像查询正在搜索一个字面上包含 ''...非常感谢您的帮助!

代码片段

//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({});
    }
});

【问题讨论】:

    标签: javascript node.js mongodb meteor meteor-collections


    【解决方案1】:

    答案就在你的查询中

    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);
    

    我认为这对你来说会更好一点!

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2015-01-24
      • 2016-01-08
      • 2020-10-11
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多