mongodb $not _id

13
我需要一种搜索方式,但不包括已经在用户面前的 _id。例如,我有三个宠物档案,其中一个用户已经在查看。
在该页面上,我有一个名为“我的家庭”的标题。然后我运行此搜索:
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))));

然而,这只是阻止整个程序运行。


这是一个很好的问题,我也需要这个信息,但您可能考虑在客户端执行此操作,以节省服务器考虑对象 _id 的(非常小的)负载。 - Will Brickner
2个回答

28

您需要执行$ne(不等于)操作,以确保当前正在查看的宠物被业主排除在搜索之外。

mongo shell中的示例:

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

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

8

使用$ne作为(注意不需要使用ObjectId(),字符串将自动转换为ObjectId):

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

1
这与提供的答案所说的完全相同,因此无需添加另一个。只要模式类型存在(对于 _id 总是存在),那么 mongoose 就会自动从字符串进行转换,这意味着不需要显式转换。 - Blakes Seven
我添加它是因为我收到了“ObjectId未解析错误”。你说的"autocast"是什么意思?你是指db.organizations.find({"_id":{$ne:"563c50e05cdb2be30391e873"}})就足够了吗? - Aqib Mumtaz
是的。Mongoose会自动将该字符串转换为ObjectId。您可以通过启用调试来查看它是如何完成此操作以及发送到服务器的查询。mongoose.set('debug',true) - Blakes Seven
谢谢,那是正确的建议,回答已按照您的建议更新。 - Aqib Mumtaz
使用 $nin 和字符串数组怎么样? - Filip Bartuzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接