2014-03-28 94 views
0

我在做什麼錯?Mongo,Ruby,Enumerable - 我做錯了什麼?

db = Mongo::MongoClient.new(DB_URI) 
tags = db['tags'].find() 
tag_ids = tags.map { |t| t['_id'] } 

puts tags.count 
=> 4272 

tags.each do |t| 
    puts t.inspect 
end 
=> # does not produce anything. As if it was empty. 

如果我註釋此行 # tag_ids = tags.map { |t| t['_id'] },每個方法正常工作。

使用ruby 1.9.3p545和寶石mongo 1.9.2

+0

只要告訴我'puts db ['tags']。find()。class'的輸出...... –

+0

在上一個循環中,您得到't',但是放入'tag'。試着把它改成't.inspect' –

+0

@YevgeniyAnfilofyev把它當作答案.. :-)看來......我今天下午還在睡覺。 :) –

回答

2

.find()的結果是一個不cursor數組或列表。光標與數據庫只有有史以來單程和一次只有。你已經把所有的結果都拿出來了,所以是的,當你再次使用它的時候它現在是空的。

.count()方法從包含返回數字的遊標返回元數據。所以用法可以,

您可以使用.rewind()方法。但是,這一切確實是再次執行查詢。所以這可能會或可能不是你想要的。

如果您需要多次使用列表,然後將所有結果拖放到自己的數組中,並以不同的方式進行迭代。或者通過「一次通過」的方式來達到你想要的目標。

+0

Thanx爲您的答案。所以我試着用'tags = db ['tags']。find()。to_a'來代替第2行。這個在Mongo :: Cursor上調用的方法應該執行查詢,然後返回一個哈希數組。所以我正在處理一個數組。它仍然不起作用。 – dvxam

+0

好的。甚至最糟糕的是:當使用'map'而不是'each'時。我認爲'地圖'使用'每個'.. – dvxam

+0

@ user3471833'.to_a'應該爲你工作,根據我最後的陳述那裏。嘗試和調試內容,可能在限制數組上使用'.limit()'和'JSON.pretty_generate()'來查看結果是否符合您的期望。 –