Ruby 西纳特拉可以';在进行MongoDB查询时,请不要将符号转换为整数

Ruby 西纳特拉可以';在进行MongoDB查询时,请不要将符号转换为整数,ruby,mongodb,sinatra,typeerror,Ruby,Mongodb,Sinatra,Typeerror,这是我关于torrent indexer的另一个MongoDB问题的后续部分 我正在制作一个开源的torrent索引器(本质上像一个迷你TPB),目前为后端提供SQLite和MongoDB 然而,我在MongoDB部分遇到了麻烦。在西纳特拉,当我试图上传洪流或搜索洪流时,我会感到不安 在上传的时候,你需要给torrent贴上标签,但是它在这里失败了。添加标记的代码如下所示: def add_tag(tag) if $sqlite unless tag_exists? tag

这是我关于torrent indexer的另一个MongoDB问题的后续部分

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

然而,我在MongoDB部分遇到了麻烦。在西纳特拉,当我试图上传洪流或搜索洪流时,我会感到不安

在上传的时候,你需要给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行(如上所述),然后失败。发生什么事?此外,作为参考,随着解决方案的出现,这可能会变成一些其他问题

谢谢

编辑

因此,我没有返回带有
[:\u id]
的标记结果,而是将elsif中的块更改为:

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

但仍然会出现错误。您可以在上看到演示,在上看到源代码,我认为这里的问题是
[:\u id]
。我对Mongo不太了解,但是,
`$tag.find({:tag=>tag})
可能是重新生成一个数组,并且没有定义将一个符号传递给[]数组操作符。

我认为这里的问题是
[:\u id]
。我对Mongo不太了解,但是,
`$tag.find({:tag=>tag})
可能是重新生成一个数组,并将一个符号传递给[]数组操作符,但没有定义。

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

 id = $tag.insert({:tag => tag})
id
将是一个,因此您可以根据需要的返回值使用适当的方法:

 return id         #  BSON::ObjectId('5017cace1d5710170b000001')
 return id.to_s    # "5017cace1d5710170b000001"
在你最初的问题中,你试图使用这个方法。这将返回一个,但您正试图将光标作为文档引用。您需要使用
each
next
在光标上迭代,例如:

 cursor = $tag.find_one({:tag => tag})
 return cursor.next['_id'];
如果需要单个文档,则应使用

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

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

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

 id = $tag.insert({:tag => tag})
id
将是一个,因此您可以根据需要的返回值使用适当的方法:

 return id         #  BSON::ObjectId('5017cace1d5710170b000001')
 return id.to_s    # "5017cace1d5710170b000001"
在你最初的问题中,你试图使用这个方法。这将返回一个,但您正试图将光标作为文档引用。您需要使用
each
next
在光标上迭代,例如:

 cursor = $tag.find_one({:tag => tag})
 return cursor.next['_id'];
如果需要单个文档,则应使用

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

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

好的,现在我有:
id=$tag.find({:tag=>tag});放置id检查;返回id
但得到相同的错误它不可能是完全相同的错误。位置是
[]
它现在说什么?看跌期权说什么?试着打印这个类。
put
最后并没有放任何东西,现在我有了:
id=$tag.find({:tag=>tag});放置id检查;返回id
但得到相同的错误它不可能是完全相同的错误。位置是
[]
它现在说什么?看跌期权说什么?试着打印这个类。
put
不会放任何东西。我可以将Mongo::Cursor更改为一个iterable数组吗?@tekknolagi:Mongo::Cursor已经是一个迭代器了。。因此,您可以使用或获取文档。例如:
$tag.find({:tag=>tag})。。。结束
。我可以将Mongo::Cursor更改为iterable数组吗?@Teknolagi:Mongo::Cursor已经是迭代器了。。因此,您可以使用或获取文档。例如:
$tag.find({:tag=>tag})。。。结束