2010-12-08 14 views
23

में आईडी के सरणी को पुनर्प्राप्त करना Mongoid में IDs की सरणी कैसे प्राप्त करें?मोंगोइड

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

आप यह काम आसानी से कर सकते हैं यदि आप किसी अन्य विशेषता

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

लेकिन मैं कैसे mongoid में यह करने के लिए सोच रहा हूँ पुन: प्राप्त करने कर रहे हैं -> यह एक बहुत ही सरल और आम आपरेशन

उत्तर

39

होना चाहिए याद रखें कि आईडी :_id और :id के रूप में संग्रहीत नहीं है। वहाँ एक id सहायक तरीका है, लेकिन जब आप प्रश्नों करते हैं, आप :_id उपयोग करना चाहिए:

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

अक्सर मैं इसे उपयोगी जटिल प्रश्न करने के लिए आईडी की एक सूची प्राप्त करने के लिए लगता है, इसलिए मैं कुछ ऐसा कार्य करें:

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

समाधान ऊपर ठीक काम करता है जब उपयोगकर्ता की मात्रा कम होती है। लेकिन हजारों उपयोगकर्ताओं के दौरान इसमें बहुत मेमोरी की आवश्यकता होगी। – dpaluy

+0

@dpaluy आप सही हैं - यह दृष्टिकोण केवल एक हैक है। साथ ही, डेटा पहले और दूसरे प्रश्नों के बीच बदल सकता है, खासकर जब बहुत सारे दस्तावेज़ होते हैं। सावधानी के साथ प्रयोग करें, या बेहतर अभी तक, बेहतर तरीके से पता लगाएं! – bowsersenior

+3

बेहतर तरीका '.mist (: _ id) 'के बजाय' .distinct (: _ id)' का उपयोग करना है। क्वेरी को निष्पादित करने के दौरान 'विशिष्ट' काम करता है जो कि सरणी – Zakwan

4

ब्राउज़र वरिष्ठ द्वारा सुझाई गई उपरोक्त विधि कम से कम मेरे लिए काम नहीं कर रही है। मैं क्या है:

User.criteria.id(arr) 
+3

लूप को लूप करने के लिए रेल कहने से थोड़ा तेज़ है। बस एक त्वरित नोट। Mongoid 2.0.0 और बाद में, आपको 'id' के बजाय' for_ids' का उपयोग करने की आवश्यकता होगी: 'user.criteria.for_ids (arr)' – bowsersenior

5

या बस:

arr = ['id1', 'id2', 'id3'] 
User.find(arr) 
+1

उपरोक्त के साथ समस्या: यदि केवल एक आईडी नहीं मिली है, तो यह वापस आ जाएगी त्रुटि और आईआईडी नहीं मिलीं। – dman

+0

'Mongoid.raise_not_found_error = false' दस्तावेज़ से बच जाएगा उपर्युक्त क्वेरी पर त्रुटि नहीं मिली – r3bo0t

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) 

आईडी को छोड़कर प्रत्येक फ़ील्ड में शून्य के साथ उपयोगकर्ता ऑब्जेक्ट्स की एक सूची तैयार करेगा।

(mongoid 2.5 के लिए) समाधान:

User.collection.master.where(:foo => :bar).to_a.map {|o| o['_id']} 
संबंधित मुद्दे