2013-02-22 12 views
8

Ho bisogno di un modo per cercare ma non include un _id che è già sullo schermo di fronte all'utente. Ad esempio, ho 3 profili di animali domestici che l'utente sta già visualizzando.

In quella pagina ho un titolo chiamato La mia famiglia. Quindi eseguo questa ricerca:

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

E restituisce tutti gli animali domestici nella mia famiglia pur sapendo che ne sto già mostrando uno. Quindi voglio escludere questo _id dalla ricerca.

Ho pensato qualcosa del genere.

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

Tuttavia, ciò interrompe completamente l'esecuzione.

+0

Questa è una buona domanda, e avevo bisogno anche questa informazione, ma potresti considerare di farlo sul lato client per salvare il server dal carico (molto piccolo) di considerare l'oggetto _id? –

risposta

13

È necessario eseguire un $ne (not equal) per assicurarsi che l'animale corrente che si sta visualizzando sia escluso dalla ricerca per proprietario.

esempio nel mongo shell:

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

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

Usa $ne come (si noti alcuna necessità di utilizzare ObjectId(), stringa sarà autocast a ObjectId):

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

Quindi è uguale a quello che dice la risposta fornita, quindi non è necessario aggiungerne un altro. Inoltre, purché sia ​​presente il tipo di schema (e sempre per '_id'), la mangusta eseguirà automaticamente l'autocast dalla stringa, il che significa che non è richiesta una conversione esplicita. –

+0

L'ho aggiunto perché stavo ottenendo "Errore ObjectId non risolto". Cosa intendi con autocast? intendi db.organizations.find ({"_ id": {$ ne: "563c50e05cdb2be30391e873"}}) è sufficiente? –

+0

Sì. Mongoose prenderà quella stringa e la convertirà automaticamente in un 'ObjectId'. Puoi vedere come funziona questa e la query inviata al server abilitando il debug. 'mongoose.set ('debug', true)' –

Problemi correlati