评论

小程序云开发:使用云函数实现模糊搜索功能

小程序云开发:使用云函数实现模糊搜索功能

做小程序的时候大家都会需要到搜索的功能,今天就把我这边测试成功的案例给大家。

微信官方文档:

获取一个集合的数据

如果要获取一个集合的数据,比如获取 todos 集合上的所有记录,可以在集合上调用 get 方法获取,但通常不建议这么使用,在小程序中我们需要尽量避免一次性获取过量的数据,只应获取必要的数据。为了防止误操作以及保护小程序体验,小程序端在获取集合数据时服务器一次默认并且最多返回 20 条记录,云函数端这个数字则是 100。开发者可以通过 limit 方法指定需要获取的记录数量,但小程序端不能超过 20 条,云函数端不能超过 100 条。

话不多说,代码开始:

search云函数部分(PS:记得上传云函数)

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let keyWords = event._keyword
  try {
    //这里的keyWords是前端小程序访问的参数_keyword
    return await db.collection('softshow').limit(50).where(
        db.command.or([{
            //使用正则查询,实现对‘name’字段的搜索的模糊查询
            name: db.RegExp({
              regexp: keyWords,
              options: 'i'//大小写不区分
            }),
          }
          //下面可以增加更多的选项,可以做多字段的选择
        ])
      ).get()
  } catch (e) {
    console.log(e)
  }
  return {
    event,
  }
}

search.wxml部分代码

<view class="page-box">
    <view class="page-content">
        <view class="search-wrap radius-border">
            <view class="search-type">
                <icon class="searchcion" size='20' type='search'></icon>
            </view>
            <input class="search-input" bindinput="bindSearchKey" placeholder="请输入关键字" value="{{searchValue}}" />
            <view class="search-button">
                <view class='sousuo' catchtap="see" style="font-size:32rpx">搜索</view>
            </view>
        </view>
    </view>
<!-- 搜索列表 -->
    <block wx:if='{{obj}}' wx:for='{{obj}}' wx:key=''>
        <view class="list-box">
            <view class="img-wrap">
                <image class="img-h5" src="{{item.logo}}"></image>
            </view>
            <view class="info">
                <view class="title">{{item.name}}</view>
            </view>
        </view>
    </block>
</view>

search.wxss部分代码

.page-content{
  padding-top15rpx;
  margin-bottom20px;
}
.search-wrap{
  overflow: hidden;
  border-radius8rpx;
  height40px;
  display: flex;
  align-items: center;
  border-radius5px;
  background-color#fbfbfb;
  font-size0;
  line-height1;
  position: relative;
}
.search-input{
  margin0 8px;
  flex1;
  height100%;
  font-size16px;
}
.search-button{
  background-color#00ae65;
  width70px;
  height100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color#fff;
  border-radius:0 5px 5px 0;
}
.search-type{
  width40px;
  height100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color#333;
  font-size14px;
  position: relative;
  background-color#e4e4e4;
}
/* 列表样式 */
.list-box{
  position: relative;
    padding12px 16px;
    padding-left70px;
    height40px;
    background-color#fff;
    margin-bottom10px;
}
.img-wrap{
  position: absolute;
    left16px;
    top12px;
    width40px;
    height40px;
    border-radius3px;
    overflow: hidden;
    background-color#eee;
}
.img-h5{
  position: absolute;
    width100%;
    height100%;
    background-position50%;
    background-size: cover;
    background-repeat: no-repeat;
    background-color#eee;
    border-radius: inherit;
}
.info{
  height98%;
    flex-direction: column;
    justify-content: space-between;
}
.title{
  font-size16px;
    color#333;
    line-height40px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.zaiyao{
  font-size13px;
    color#999;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp2;
    overflow: hidden;
}

search.js部分代码

// pages/search/search.js
var text=''
 
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
 
  },
  see(){
 
    wx.cloud.callFunction({
      name'search',
      data: {
       //this.data.searchKey由页面输入框的内容
          _keywordthis.data.searchKey,
      },
      completeres => {
        console.log(res)
          let resources = res.result.data
          this.setData({
            obj: resources
          })
      },
      failres => {
      },
  })
  },
 
  bindSearchKeyfunction(e{
    this.setData({
        searchKey: e.detail.value
    })
},
  /**
   * 生命周期函数--监听页面加载
   */
  onLoadfunction (options{


  },
})
最后一次编辑于  2022-03-28  
点赞 5
收藏
评论

5 个评论

  • crazybeans
    crazybeans
    2023-01-11

    exports.main = async (event, context) => {

      return await db.collection('demo_list').where(_.or([{

        title: db.RegExp({

          regexp: event.key,

          options: 'i'

        }),

        tags: db.RegExp({

          regexp: event.key,

          options: 'i'

        })

      }])).get()

    }

    js 如下

    click_search() {

     wx.cloud.callFunction({

          name: 'search',

          data: {

            key: this.data.key

          }

        }).then(res => {

          console.log(res.result)

        })

      },

    {data: Array(0), errMsg: "collection.get:ok"}

    搜索不到结果。。但是一样的方法,在小程序端能搜到!

    2023-01-11
    赞同
    回复 1
    • crazybeans
      crazybeans
      2023-01-11
      不是在小程序端,是用小程序端的 wx.cloud.database 方法能搜到,但是想突破20条必须用云函数啊!
      2023-01-11
      回复
  • SnailRun
    SnailRun
    2022-05-21

    会不会存在刚进来搜索值为空

    搜索不到内容

    2022-05-21
    赞同
    回复
  • 🍒 妮
    🍒 妮
    2022-04-23

    谢谢大佬!

    2022-04-23
    赞同
    回复
  • Yoncey
    Yoncey
    2022-04-11

    谢谢大佬!!!!我的问题终于解决了,太感谢了!!!!!!

    2022-04-11
    赞同
    回复
  • 黄兴
    黄兴
    2022-03-30

    优秀

    2022-03-30
    赞同
    回复
登录 后发表内容