2

这是我关于洪流索引器的其他 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/上查看源代码

4

2 回答 2

4

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

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

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

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

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

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

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

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

 return $tag.find_one({:tag => tag})['_id']
于 2012-07-31T12:30:39.233 回答
0

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

于 2012-07-30T22:00:27.487 回答