2010-12-08 47 views
23

如何檢索MongoidIDs的數組?檢索Mongoid中的ID數組

arr=["id1","id2"] 
User.where(:id=>arr) 

你可以,如果你正在檢索另一屬性

User.where(:nickname.in=>["kk","ll"]) 

但我想知道如何在mongoid做到這一點很容易做到這一點 - >這應該是一個非常簡單和常見的操作

回答

39

請記住,ID存儲爲:_id而不是:id。有一個id的輔助方法,但是當你做查詢,你應該使用:_id

User.where(:_id.in => arr) 

我常常覺得有用讓IDS做複雜查詢的列表,所以我這樣做:

user_ids = User.only(:_id).where(:foo => :bar).map(&:_id) 
Post.where(:user_id.in => user_ids) 
+0

當用戶的量小的溶液上方工作正常。但有數千用戶需要大量內存。 – dpaluy 2012-10-15 20:30:52

+0

@dpaluy你是對的 - 這種方法只是一個破解。此外,數據可能會在第一次和第二次查詢之間發生變化,特別是在有大量文檔的情況下。謹慎使用,或者更好,找出更好的方法! – bowsersenior 2012-10-16 19:28:10

+3

更好的方法是使用`.distinct(:_ id)`而不是`.map(&:_ id)`。 `distinct`在執行查詢時起作用,這比告訴導軌循環數組要快得多。 – Zakwan 2014-05-23 17:06:01

4

上面的方法建議browsersenior似乎沒有工作了,至少對我來說。我要做的就是:

User.criteria.id(arr) 
5

或者乾脆:以上

arr = ['id1', 'id2', 'id3'] 
User.find(arr) 
2
user_ids = User.only(:_id).where(:foo => :bar).map(&:_id) 
Post.where(:user_id.in => user_ids) 

解決方案的工作正常,當用戶量小。但有數千用戶需要大量內存。

User.only(:_id).where(:foo => :bar).map(&:_id) 

將創建一個用戶對象列表,其中每個字段中的nil除id外。

(對於mongoid 2.5)將溶液:

User.collection.master.where(:foo => :bar).to_a.map {|o| o['_id']}