2013-02-22 33 views
8

मुझे खोजने के लिए एक तरीका चाहिए लेकिन उपयोगकर्ता के सामने स्क्रीन पर पहले से मौजूद _id शामिल नहीं है। उदाहरण के लिए, मेरे पास 3 पालतू प्रोफाइल हैं जो उपयोगकर्ता पहले ही देख रहा है।

उस पृष्ठ पर मेरे पास माई फैमिली नामक एक शीर्षक है। मैं तो यह खोज चलाएँ:

public function fetch_family($owner) 
    { 
     $collection = static::db()->mypet; 
     $cursor = $collection->find(array('owner' => new MongoId($owner))); 

     if ($cursor->count() > 0) 
      { 
       $family = array(); 
       // iterate through the results 
       while($cursor->hasNext()) { 
        $family[] = ($cursor->getNext()); 
       } 
       return $family; 
      } 
    } 

और यह मेरे परिवार में सभी पालतू जानवरों रिटर्न भी जानने मैं पहले से ही एक दिखा रहा हूँ। तो मैं खोज से उस _id को बाहर करना चाहता हूं।

मैंने ऐसा कुछ सोचा।

$cursor = $collection->find(array('owner' => new MongoId($owner), '$not'=>array('_id'=>new MongoId(INSERT ID HERE)))); 

हालांकि, यह पूरी चीज़ को चलने से रोकता है।

+0

यह एक अच्छा सवाल है, और मैं की जरूरत यह जानकारी भी है, लेकिन आप ऑब्जेक्ट _id पर विचार करने के सर्वर को (बहुत छोटे) लोड से बचाने के लिए क्लाइंट पक्ष पर ऐसा करने पर विचार कर सकते हैं? –

उत्तर

13

यह सुनिश्चित करने के लिए कि आप वर्तमान पालतू जानवर को देख रहे हैं, उसे $ne (not equal) करने की आवश्यकता है ताकि मालिक द्वारा खोज से बाहर रखा जा सके।

उदाहरण mongo खोल में:

var viewingPetId = ObjectId("515535b6760fe8735f5f6899"); 
var ownerId = ObjectId("515535ba760fe8735f5f689a"); 

db.mypet.find(
    { 
     _id: { $ne: viewingPetId }, 
     owner: ownerId 
    } 
) 
6

उपयोग $ne के रूप में (कोई ObjectId() उपयोग करने के लिए, स्ट्रिंग ObjectId को ऑटोकास्ट जाएगा जरूरत नोटिस):

db.organizations.find({"_id" : {$ne:"563c50e05cdb2be30391e873"}}) 
+0

इस प्रकार प्रदान किया गया उत्तर जैसा ही कहता है, इसलिए किसी और को जोड़ने की आवश्यकता नहीं है। साथ ही जब तक स्कीमा प्रकार मौजूद है (और हमेशा '_id' के लिए है) तो mongoose स्ट्रिंग से ऑटोकास्ट होगा, जिसका अर्थ है कि एक स्पष्ट रूपांतरण की आवश्यकता नहीं है। –

+0

मैंने इसे जोड़ा क्योंकि मुझे "ObjectId त्रुटि हल नहीं हुई" मिल रही थी। ऑटोकास्ट द्वारा आपका क्या मतलब है? क्या आपका मतलब db.organizations.find ({"_ id": {$ ne: "563c50e05cdb2be30391e873"}} पर्याप्त है? –

+0

हां। Mongoose उस स्ट्रिंग ले जाएगा और इसे स्वचालित रूप से 'ऑब्जेक्ट आईडी' में परिवर्तित कर देगा। आप यह देख सकते हैं कि यह कैसे करता है और क्वेरी डिबगिंग सक्षम करके सर्वर को भेजी जाती है। 'mongoose.set ('डीबग', सत्य)' –