2013-02-22 7 views
8

J'ai besoin d'un moyen de rechercher mais ne pas inclure un _id qui est déjà sur l'écran en face de l'utilisateur. Par exemple, j'ai 3 profils animaux que l'utilisateur voit déjà.

Sur cette page, j'ai un titre intitulé Ma famille. Je lance alors cette recherche:

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

Et il renvoie tous les animaux de compagnie dans ma famille même sachant que j'en montre déjà un. Donc, je veux exclure ce _id de la recherche.

Je pensais à quelque chose comme ça.

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

Cependant, cela arrête simplement le fonctionnement.

+0

Ceci est une bonne question, et je devais cette information aussi, mais vous pourriez envisager de faire cela du côté client pour sauver le serveur de la (très petite) charge de considérer l'objet _id? –

Répondre

13

Vous devez faire un $ne (not equal) pour vous assurer que l'animal de compagnie que vous regardez est exclu de la recherche par le propriétaire.

Exemple dans la coquille mongo:

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

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

Utilisez $ne comme (notez pas nécessaire d'utiliser ObjectId(), chaîne sera AUTOCAST à ObjectId):

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

Ainsi, c'est exactement la même chose que ce que dit la réponse, il n'est donc pas nécessaire d'en ajouter une autre. Aussi longtemps que le type de schéma est présent (et est toujours pour '_id') alors mongoose autocast à partir de la chaîne de toute façon, ce qui signifie qu'une conversion explicite n'est pas nécessaire. –

+0

Je l'ai ajouté parce que je recevais "ObjectId erreur non résolue". Que voulez-vous dire par autocast? voulez-vous dire db.organizations.find ({"_id": {$ ne: "563c50e05cdb2be30391e873"}}) est suffisant? –

+0

Oui. Mongoose prendra cette chaîne et la convertira en 'ObjectId' automatiquement. Vous pouvez voir comment cela se fait et la requête envoyée au serveur en activant le débogage. 'mongoose.set ('debug', true)' –

Questions connexes