2012-05-07 14 views
9

मैं अपने DB में खेल संग्रह है: जहाँ तक मैं इस तरह क्वेरी को समझनेMongoDB सभी सहायक दस्तावेज़ों एक शर्त को पूरा करने के साथ किसी दस्तावेज़ को खोजने

var game = { 
    players: [{username:"user1", status:"played"}, 
      {username:"user2", status:"accepted"}] 
} 

: db.games.find({"players.status":"played"}) मुझे सभी खेलों दे देंगे जहां कम से कम एक खिलाड़ी का दर्जा प्राप्त है "खेला"। मैं "खिलाड़ियों" की स्थिति वाले सभी खिलाड़ियों के साथ गेम कैसे ढूंढ सकता हूं?

+0

यहाँ एक और अधिक लचीला समाधान के साथ एक चर्चा: http : //stackoverflow.com/questions/11823296/mongodb-find-subdocument-in-array-matching-parameters/11823340#11823340 –

उत्तर

11

आप केवल एक अन्य स्थिति "खेला" क्वेरी का उपयोग की तुलना में है, तो:

db.games.find({ "players.status": { $ne:"accepted" } }) 

आप और अधिक स्थिति मानों को संभालने के लिए क्वेरी समायोजित कर सकते हैं, जब तक कि वे सब जाना जाता है क्वेरी के समय ।

db.collection.aggregate ([{$ खोलना:: "$ players.status"}, {$ मैच: { "players.status": "खेला

+1

इस तरह मैंने इसे किया। अभी भी सोच रहा है कि कोई बेहतर तरीका है, क्योंकि अब जब भी मैं एक नई गेम स्थिति जोड़ता हूं तो मुझे क्वेरी को बदलना होगा। – andr111

+1

आप अपनी क्वेरी को गतिशील बना सकते हैं - यदि आप सरणी के रूप में सभी स्टेटस मानों का एक सेट बनाते हैं, तो इससे "खेले गए" को हटा दें और इसे $ nin (इन नहीं) ऑपरेशन के साथ उपयोग करें, इसे काम करना चाहिए। –

+0

धन्यवाद, मुझे लगता है कि यह एकमात्र तरीका है जिसे मैं कर सकता हूं। – andr111

-1

एकत्रीकरण ढांचे के $ खोलना सुविधा का उपयोग करें "}, {$ परियोजना: {" _ आईडी ": 0," players.status ": 1}}])

(इस जवाब की जाँच: https://stackoverflow.com/a/15082321/1214167)

+1

जो ओपी चाहता है उससे मेल नहीं खाता - यह केवल उन खिलाड़ियों को वापस लौटाएगा जिनके पास "खेले गए" स्थिति हैं - समस्या उन टीमों को वापस करना था जहां सभी खिलाड़ियों ने खेला था। आप इसे चलाने वाले खिलाड़ियों की संख्या को गिनने और पूर्ण सरणी के आकार की तुलना करने के लिए क्वेरी को विस्तारित करके एकत्रीकरण के साथ कर सकते हैं, लेकिन यह सरल खोज से अधिक जटिल और धीमा है। –

संबंधित मुद्दे