类定义中的 Mongo _id

Posted

技术标签:

【中文标题】类定义中的 Mongo _id【英文标题】:Mongo _id in class definition 【发布时间】:2012-06-17 08:12:49 【问题描述】:

这是我第一次将对象推入 Mongo - 我正在使用 php。我知道 MongoDB 在使用 MongoCollection::insert() 函数插入时将 _id 变量添加到数组中。问题是这样的:

如果我定义了一个名为 _id 的公共变量,则该变量在插入时仍为 NULL

class MognoTest 
    public _id;
    public foo;

    public function __construct()
        $this->foo = 'bar';
    


$obj = new MongoTest();
$Mongo->collection->insert($obj);
var_dump($obj)
$found_obj = $Mongo->collection->findOne();
var_dump($found_obj);

$obj$found_obj 上的 var_dump()s 都返回带有 _id=NULL 的对象。如果我在类定义中注释掉 _id,代码运行正常,var_dump()s 都会打印一个 MongoID。

我想在类中定义一个 _id 以使我的代码更清晰,并使我在 Netbeans 上的代码提示正常工作。有什么我忽略的吗?

【问题讨论】:

在将_id 插入数据库之前,您是否尝试过设置它的值? 我打算使用 MongoDB 自动生成的 MongoID 作为我的主键,稍后我将在我的代码中使用。 【参考方案1】:

好的,所以我找到了一个解决方案,尽管说实话我不喜欢它——对我来说这似乎不优雅。

class MognoTest 
    public _id;
    public foo;

    public function __construct($load = NULL)
        $this->foo = 'bar';
        if ($load != NULL && isset($load['_id']))
            $this->_id = $load['_id'];
    
    public function insertPrep()
        if ($this->_id === NULL)
            unset($this->_id);
    


//create object, prep, insert
$obj = new MongoTest();
$obj->insertPrep();
$Mongo->collection->insert($obj);
var_dump($obj)

//get object back and reload as object
$found_obj = $Mongo->collection->findOne();
$new_obj = new MongoTest($found_obj);
var_dump($new_obj);

我认为这个解决方案不够优雅,因为程序员现在必须记住在每次插入 MongoTest::insertPrep() 之前添加一行代码。我还尝试添加一个public function __insert() 魔术函数,但没有成功:(

我仍在寻找更好的解决方案。但对于遇到此问题的任何人,这里有一个修复,即使这个修复不是我所希望的优雅。

【讨论】:

以上是关于类定义中的 Mongo _id的主要内容,如果未能解决你的问题,请参考以下文章

防止插入Mongo集合的数组中的空值

mongoDB--概念

Mongo:管道中的 $exists $lookup 未按预期工作

Mongo基础 索引的使用

mongo中的模糊查询

根据同一文档中的另一个数组查询 Mongo 文档数组