2013-02-22 11 views
8

Potrzebuję sposobu na wyszukanie, ale nie włączam _id, który jest już na ekranie przed użytkownikiem. Na przykład mam 3 profile zwierząt domowych, które użytkownik już przegląda.

Na tej stronie mam nagłówek o nazwie Moja rodzina. Następnie uruchomię to wyszukiwanie:

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; 
      } 
    } 

I zwraca wszystkie zwierzęta w mojej rodzinie, nawet wiedząc, że już je mam. Więc chcę wykluczyć, że jeden _id z wyszukiwania.

Myślałem coś takiego.

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

Jednak to po prostu zatrzymuje działanie.

+0

To jest dobre pytanie, a ja potrzebowałem te informacje też, ale możesz rozważyć zrobienie tego po stronie klienta, aby zapisać serwer z (bardzo małego) obciążenia rozważenia obiektu _id? –

Odpowiedz

13

Należy wykonać numer , aby upewnić się, że aktualnie oglądane zwierzę jest wyłączone z wyszukiwania według właściciela.

przykład w mongo powłoki:

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

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

Zastosowanie $ne jak (zawiadomienie nie ma potrzeby korzystania ObjectId(), ciąg będzie AutoCast do ObjectId):

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

Tak więc jest to to samo, co podana odpowiedź, więc nie ma potrzeby dodawania kolejnej. Dopóki obecny jest typ schematu (i zawsze jest dla '_id'), to mangusta i tak będzie automatycznie przesyłany z łańcucha, co oznacza, że ​​wyraźna konwersja nie jest wymagana. –

+0

Dodałem go, ponieważ otrzymywałem "ObjectId not resolved error". Co masz na myśli przez autocast? masz na myśli, że db.organizations.find ({"_ id": {$ ne: "563c50e05cdb2be30391e873"}}) jest wystarczający? –

+0

Tak. Mongoose pobierze ten ciąg i automatycznie przekształci go w 'ObjectId'. Możesz zobaczyć, jak to działa, a zapytanie wysłane do serwera, włączając debugowanie. 'mongoose.set ('debug', true)' –

Powiązane problemy