【问题标题】:Sinatra can't convert Symbol into Integer when making MongoDB query进行 MongoDB 查询时,Sinatra 无法将 Symbol 转换为 Integer
【发布时间】:2012-07-28 14:52:58
【问题描述】:

这是我关于洪流索引器的另一个 MongoDB 问题的后续。

我正在制作一个开源 torrent 索引器(本质上就像一个迷你 TPB),目前为后端提供 SQLite 和 MongoDB。

但是,我在其中的 MongoDB 部分遇到了问题。在 Sinatra 中,我在尝试上传种子或搜索种子时收到 。

在上传时,需要标记 torrent — 在这里失败了。添加标签的代码如下:

def add_tag(tag)
  if $sqlite
    unless tag_exists? tag
      $db.execute("insert into #{$tag_table} values ( ? )", tag)
    end
    id = $db.execute("select oid from #{$tag_table} where tag = ?", tag)
    return id[0]
  elsif $mongo
    unless tag_exists? tag
      $tag.insert({:tag => tag})
    end
    return $tag.find({:tag => tag})[:_id] #this is the line it presumably crashes on
  end
end

它到达第 105 行(如上所述),然后失败。这是怎么回事?此外,作为仅供参考,随着解决方案的出现,这可能会变成其他一些问题。

谢谢!

编辑

因此,我没有使用[:_id] 返回标签结果,而是将 elsif 中的块更改为:

id = $tag.find({:tag => tag})
puts id.inspect
return id

仍然出现错误。您可以在http://torrent.hypeno.de 看到演示,在http://github.com/tekknolagi/indexer/ 看到源代码

【问题讨论】:

    标签: ruby mongodb sinatra typeerror


    【解决方案1】:

    鉴于您正在执行insert(),获取 id 的最简单方法是:

     id = $tag.insert({:tag => tag})
    

    id 将是 BSON::ObjectId,因此您可以根据所需的返回值使用适当的方法:

     return id         #  BSON::ObjectId('5017cace1d5710170b000001')
     return id.to_s    # "5017cace1d5710170b000001"
    

    在您最初的问题中,您尝试使用 Collection.find() 方法。这将返回 Mongo::Cursor,但您正试图将光标作为文档引用。您需要使用eachnext 遍历光标,例如:

     cursor = $tag.find_one({:tag => tag})
     return cursor.next['_id'];
    

    如果你想要一个文档,你应该使用Collection.find_one()

    例如,您可以使用以下方法查找并返回 _id:

     return $tag.find_one({:tag => tag})['_id']
    

    【讨论】:

    • 我可以将 Mongo::Cursor 更改为可迭代数组吗?
    • @tekknolagi: Mongo::Cursor 已经是一个迭代器......所以你可以使用eachnext 来获取文档。例如:$tag.find({:tag => tag}).each do |doc| ... end.
    【解决方案2】:

    我认为这里的问题是[:_id]。我对 Mongo 了解不多,但 `$tag.find({:tag => tag}) 可能正在重新排列一个数组,并且未定义将符号传递给 [] 数组运算符。

    【讨论】:

    • 好的,现在我有:id = $tag.find({:tag => tag}); puts id.inspect; return id 但得到同样的错误
    • 不可能是完全相同的错误。地点是[]现在怎么说?
    • 看跌期权说什么?尝试打印课程。
    • puts 最终没有放任何东西
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2014-03-12
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多