2013-02-22 6 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; 
      } 
    } 

을 그리고 심지어 이미 1을 표시하고 알고 내 가족의 모든 애완 동물을 반환합니다. 그래서 검색에서 하나의 _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 
    } 
) 
( ObjectId()를 사용할 필요, 문자열 ObjectId에 자동 시전합니다 알 수 없음)으로
6

사용 $ne :

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

제공된 답변에서 말하는 것과 동일하므로 다른 답변을 추가 할 필요가 없습니다. 또한 스키마 타입이 존재하고 (항상'_id'를위한 것입니다.) mongoose는 어쨌든 문자열로부터 자동 캐스팅 할 것입니다. 이것은 명백한 변환이 필요 없다는 것을 의미합니다. –

+0

"ObjectId가 오류를 해결하지 못했습니다."때문에 추가되었습니다. 오토 캐스트가 무슨 뜻이야? db.organizations.find ({ "_ id": {$ ne : "563c50e05cdb2be30391e873"}})이면 충분합니까? –

+0

예. Mongoose는 해당 문자열을 가져 와서 자동으로 'ObjectId'로 변환합니다. 디버깅을 사용 가능하게하여 서버로 전송 된 조회 및 조회를 볼 수 있습니다. 'mongoose.set ('debug', true)' –