跨字段的 “或” 操作

我们都知道对于一个搜索功能,往往关键字是针对于数据库(集合)中的多个字段进行搜索的。

这里我在写音乐搜索功能时想实现既能通过歌手搜索也能通过歌手姓名搜索,由于我对集合操作不熟悉,我选择了最原始的方法,也就是先按照name(歌名)搜索出来,成功后在按照歌手名称(singer)去搜索一遍,把得到的两个数组合并得到一个新数组然后去重,得到想要的结果。

代码如下:

       _data = {
          _openid: app.globalData._openid,
          name: keywords,    //歌名
        }
        _datas = {
          _openid: app.globalData._openid,
          singer: keywords,    //歌手
        }
allsongs.where(_data).get({
      success(_res) {
        // res.data 包含该记录的数据
        console.log(_res.data)
        that.setData({
          allsongs: _res.data
        })
        if (that.data.typenum == 0 || that.data.typenum == 1) {
          var songlist =[]
          allsongs.where(_datas).get({
            success(res) {
              // res.data 包含该记录的数据
              for (var i = 0; i < res.data.length;i++){
                var flag = true;
                for (var j = 0; j < _res.data.length; j++) {
                  if (res.data[i]._id == _res.data[j]._id) {
                    flag = false;
                  }
                }
                if (flag) {
                  that.data.allsongs.push(res.data[i]);
                };
              }
              that.setData({
                allsongs: that.data.allsongs
              })
              
            }
          })
        }
      }
    })

通过上面的代码我们可以看到仅仅两个字段的搜索便是如此复杂,那如果是三个或者更多呢,没法想象有可能就会陷入死循环中。

所以今天我专门看了下API开发文档,发现    db.command.or 查询指令,用于表示逻辑 "或" 的关系,可以同时满足多个查询筛选条件。或指令有两种用法,一是可以进行字段值的 “或” 操作,二是也可以进行跨字段的 “或” 操作,这里我们对应的是跨字段的 “或” 操作。

具体代码实现如下:

  onSearch_1(){
    var that = this
    // 获取集合的引用
    const allsongs = app.globalData.db.collection('allsongs')
    const _ = app.globalData.db.command
    var keywords = new RegExp(that.data.keywords)
    allsongs.where(_.or([
      {
        name: keywords
      },
      {
        singer: keywords
      }
    ])).get({
      success(res) {
        that.setData({
          allsongs: res.data
        })
      }
    })
  },

以上两种方式均能实现以下效果:

 

posted @ 2018-12-19 13:53  Smile_ruo  阅读(294)  评论(0)    收藏  举报