【问题标题】:Building Autocomplete with Flask, MongoDB, jQuery使用 Flask、MongoDB、jQuery 构建自动完成功能
【发布时间】:2016-11-10 08:33:51
【问题描述】:

我正在尝试使用 Flask、MongoDB 和 jQuery Autocomplete 构建自动完成搜索。一旦用户开始在搜索栏中键入地址,我想显示地址列表。例如,如果用户键入123 F,我想根据该字符串显示 5 个紧密匹配的地址。从列表中选择一个地址后,我想显示一些与该地址关联的属性,这些属性是同一个 CSV 表的一部分。

我有一个简单的 CSV 地址文件,其结构如下:

ID ADDRESS
1  123 Fakevill St
2  35 Lakeshore Rd
.. and so on

我首先使用以下命令将此 CSV 文件导入 MongoDB:

mongoimport --db myDB --collection myAddresses --file "/path/to/file" --type csv --headerline

虽然我还没有开始在客户端工作,但我在服务器端遇到了一些问题。我的服务器端正则表达式查询不返回任何结果。以下是我在 Flask 中的设置方式:

@app.route('/getInfoByAddress', methods=['GET'])
def getInfoByAddress():
    searchedAddress = request.args.get("Address")
    addressCollection = myDB["addresses"]
    addressJSON = []
    regex = "/^" + searchedAddress + "/"

    for address in addressCollection.find({'Address': re.compile(regex, re.IGNORECASE)},{"Address":1, "ID":1, "_id":0}):
        addressJSON.append({"Address":address["Address"]})
    return jsonify({"Addresses":addressJSON})

我使用regexre 的组合来处理自动完成和类型案例。目前,当我去浏览器测试查询时,myapp.dev:5000/getInfoByAddress?Address=123 F,它返回一个空 JSON:

{
  "Addresses": []
}

当我执行print regex 时,我可以在命令行窗口中看到正确的字符串 (/^123 F/) 正在发送到数据库,但遗憾的是我没有看到任何结果。

【问题讨论】:

  • addressCollection.find(...) 返回什么?你确定数据加载正确吗?你能从数据库中得到什么吗?
  • 您的查询似乎不正确:stackoverflow.com/questions/3483318/…
  • 在命令行中,当我做db.addresses.find().limit(5)时,我可以看到地址列表,所以数据在那里。
  • @IanAuld 你是对的。在我的查询中使用 $regex 有效。我现在可以看到地址了。

标签: jquery python mongodb flask autocomplete


【解决方案1】:

这可能不是您正在寻找的解决方案,但功能正是您想要做的。 Select2 具有通过 ajax 实现的自动完成远程数据加载功能,实现起来非常简单,可能会让您的生活更轻松。

https://select2.github.io/examples.html 向下滚动以加载远程数据并使用他们拥有的 github 示例。

编辑:

后端问题可能是众多问题之一。由于您获得了 Addresses:[] 您的端点设置正确,它只是没有在请求之前填充数据。是否有任何服务器端错误消息?在追加到数组之前尝试在 for 循环开始后立即打印地址并检查那里是否有数据。这可能是许多事情之一。查询本身有问题并且没有返回数据。数据不是您期望的格式,您可能遇到字典键问题。我有一段时间没有和 mongo 合作过,所以这个是在黑暗中拍摄的。试试for address in addressCollection.find({'Address': re.compile(regex, re.IGNORECASE)}).fetch():

【讨论】:

  • 这对于前端来说是一个很好的解决方案,但我目前正在努力在后端设置查询。
  • 没有服务器端错误。我尝试在循环开始之后和附加到数组之前打印地址,但控制台中没有打印任何内容。我通过上面的 for 循环代码进行了修改,以将其包含在查询 {"Address":1, "ID":1, "_id":0} 中。另外,当我尝试您建议的线路时,我收到一条错误消息 'Cursor' object has no attribute 'fetch'
  • 'Cursor' 对象将没有 fetch 属性,因为每当您调用 find 方法时,它都会自动获取对象并将它们组合成一个光标对象。
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2015-06-20
  • 1970-01-01
  • 2014-04-22
  • 2015-07-05
  • 2022-08-15
相关资源
最近更新 更多