2013-03-08 7 views
8

में एकाधिक मानों से मेल खाता है मैं एक ऐसे सरणी में तीन या अधिक मिलान मान वाले कई दस्तावेज़ ढूंढने में सक्षम होना चाहता हूं। के हम कहते हैं निम्नलिखित दस्तावेजों करते हैं:मोंगो डीबी - सरणी

[{ 
     name: 'John', 
     cars: [1, 2, 3, 4] 
    }, 
    { 
     name: 'Jane', 
     cars: [1, 2, 3, 8] 
    }, 
    { 
     name: 'Smith', 
     cars: [1, 8, 10] 
    }] 

और हम निम्नलिखित सरणी में दस्तावेजों कि मूल्यों के कम से कम तीन (कारों में) लगाना चाहते हैं:

[1, 2, 3, 4, 5, 6, 7] 

परिणाम तो होगा:

[{ 
     name: 'John', 
     cars: [1, 2, 3, 4] 
    }, 
    { 
     name: 'Jane', 
     cars: [1, 2, 3, 8] 
    }] 

कोई भी यह कैसे प्राप्त करने के बारे में जानता है?

+0

+1 अच्छा प्रश्न। मैं समय के लिए यह आश्चर्य भी करता था :) –

उत्तर

7

यह एक अच्छा सवाल है, और मुझे नहीं लगता कि मोंगोडीबी आपको सामान्य ऑपरेटरों के साथ ऐसा करने का एक आसान तरीका है। हालांकि मैं निम्न विधियों में इस लक्ष्य को हासिल करने के लिए के बारे में सोच सकते हैं:

1. नई फ़ील्ड

ऐप्लिकेशन कोड में इस गणना और दस्तावेज़ पर एक नए क्षेत्र में परिणाम बनाए रखें।

2. ब्रूट फोर्स

db.Collection.find({ $or: [ 
    { cars: $all [ 1, 2, 3 ] }, 
    { cars: $all [ 2, 3, 4 ] }, 
    ... list out all 35 combinations 
] }) 

3. उपयोग $where

db.Collection.find({ cars: { $in: [1,2,3,4,5,6,7] }, $where: function() { 
    var numMatches = 0; 
    for (var i = 1; i <= 7; i++) 
     if (this.cars.indexOf(i) > -1) numMatches++; 
    return numMatches >= 3; 
} }); 
11

आप एक $in क्वेरी जारी किए गए और उसके बाद कोड फिल्टर रिकॉर्ड में 3 या उससे अधिक प्रविष्टियों होने से हो सकता है वांछित सरणी (यहां कुछ नमूना पायथन कोड है)

def dennisQuestion(): 
    permissibleCars = [1,2,3,4,5,6,7] 
    cursor = db.collection.find({"cars": {"$in": permissibleCars}}) 
    for record in cursor: 
     if len(set(permissible) & set(record["cars"]))) >= 3 
      yield record 
+1

यह असली जवाब है –

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