2013-02-22 3 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(), строка будет AutoCast к ObjectId):

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

Таким же образом, как говорится в предоставленном ответе, поэтому нет необходимости добавлять еще один. Кроме того, если тип схемы присутствует (и всегда для '_id), то mongoose будет автокастом из строки в любом случае, что означает, что явное преобразование не требуется. –

+0

Я добавил его, потому что получаю «ObjectId not resolved error». Что вы подразумеваете под автокастом? вы имеете в виду db.organizations.find ({"_ id": {$ ne: "563c50e05cdb2be30391e873"}}) достаточно? –

+0

Да. Mongoose возьмет эту строку и автоматически преобразует ее в объект ObjectId. Вы можете увидеть, как он это делает, и запрос, отправленный на сервер, путем включения отладки. 'mongoose.set ('debug', true)' –

 Смежные вопросы

  • Нет связанных вопросов^_^