2013-02-22 18 views
8

Tôi cần một cách để tìm kiếm nhưng không bao gồm _id đã có trên màn hình trước mặt người dùng. Ví dụ, tôi có 3 hồ sơ vật nuôi mà người dùng đã xem.

Trên trang đó, tôi có một tiêu đề có tên là Gia đình của tôi. Sau đó, tôi chạy tìm kiếm này:

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

Và nó trả về tất cả vật nuôi trong gia đình tôi thậm chí biết tôi đã hiển thị. Vì vậy, tôi muốn loại trừ một trong đó _id khỏi tìm kiếm.

Tôi đã nghĩ như thế này.

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

Tuy nhiên, điều đó chỉ dừng toàn bộ hoạt động.

+0

Đây là một câu hỏi hay, và tôi cần thông tin này quá, nhưng bạn có thể xem xét làm điều này ở phía khách hàng để lưu các máy chủ từ tải (rất nhỏ) xem xét các đối tượng _id? –

Trả lời

13

Bạn cần phải thực hiện $ne (not equal) để đảm bảo con vật cưng hiện tại bạn đang xem bị loại trừ khỏi tìm kiếm của chủ sở hữu.

Ví dụ trong mongo shell:

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

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

Sử dụng $ne như (chú ý không cần phải sử dụng ObjectId(), chuỗi sẽ AutoCast để ObjectId):

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

Vì vậy, cũng giống như những gì câu trả lời được cung cấp cho biết, vì vậy không cần phải thêm một số khác. Ngoài ra, miễn là loại lược đồ có mặt (và luôn luôn là cho '_id') thì mongoose sẽ tự động lấy từ chuỗi, điều đó có nghĩa là không cần chuyển đổi rõ ràng. –

+0

Tôi thêm nó bởi vì tôi đã nhận được "ObjectId không giải quyết lỗi". Bạn có ý gì bởi autocast? bạn có nghĩa là db.organizations.find ({"_ id": {$ ne: "563c50e05cdb2be30391e873"}}) là đủ? –

+0

Có. Mongoose sẽ lấy chuỗi đó và chuyển nó thành 'ObjectId' tự động. Bạn có thể xem nó như thế nào và truy vấn được gửi đến máy chủ bằng cách cho phép gỡ lỗi. 'mongoose.set ('debug', true)' –