【问题标题】:mongodb $not _idmongodb $not _id
【发布时间】:2013-02-07 20:08:59
【问题描述】:

我需要一种搜索​​方式,但不包括已经在用户面前的屏幕上的 _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))));

但是,这只会阻止整个事情的运行。

【问题讨论】:

  • 这是一个很好的问题,我也需要这个信息,但您可能会考虑在客户端执行此操作以使服务器免于考虑对象 _id 的(非常小的)负载?跨度>

标签: mongodb find notin


【解决方案1】:

您需要发送$ne (not equal) 以确保您当前正在查看的宠物不在所有者的搜索范围内。

mongo shell 中的示例:

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

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

【讨论】:

    【解决方案2】:

    使用$ne as(注意不用ObjectId(),字符串会自动转换为ObjectId):

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

    【讨论】:

    • 因此与提供的答案所说的相同,因此无需添加另一个。此外,只要模式类型存在(并且始终为 _id ),猫鼬就会从字符串自动转换,这意味着不需要显式转换。
    • 我添加它是因为我收到“ObjectId 未解析错误”。自动播放是什么意思?你的意思是 db.organizations.find({"_id" : {$ne:"563c50e05cdb2be30391e873"}}) 就足够了吗?
    • 是的。 Mongoose 将获取该字符串并自动将其转换为ObjectId。您可以通过启用调试查看它是如何执行此操作的以及发送到服务器的查询。 mongoose.set('debug',true)
    • 谢谢,这是正确的建议,根据您的建议更新答案。
    • 如何将 $nin 与字符串数组一起使用?
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2014-10-21
    相关资源
    最近更新 更多