0

好吧,伙计们,要么我错过了一些大事,要么我只是踩到了一个虫子。

那是一个 Sf2 (v2.0.9) / Doctrine ODM (1.0.0BETA) 项目。

基本上,我有两个文件,我们称它们为 E 和 P:

  • E引用很多P:

       /**
        * @MongoDB\ReferenceMany(targetDocument="P", simple="true")
        * @MongoDB\Index
        */
        protected $p = array();
    
  • 我不在乎能够从 P 中检索相应的 E。

我已经生成了 E 的 getter/setter doctrine:mongodb:generate:documents

当我声明一个新的 E() 时,然后添加一些现有的 P ($e->addP($p)),如下所示:

$p1 = $this->dm->getRepository('ProjectBundle:P')->findOneBy(array('id' => $pid1)));
$p2 = $this->dm->getRepository('ProjectBundle:P')->findOneBy(array('id' => $pid2)));
$pArr = array($p1, $p2);
$e = new E();
foreach ($pArr as $p) {
  $e->addP();
}

(请不要对那段代码看得太深,它在我的控制器中不那么糟糕,但我仍然基本上在做一个foreach($pArr as $p)on $e->addP($p))。

我最终在我的集合 E 中得到了这种对象:

"$pushAll": {
   "p": [
    "0": ObjectId("4f4ba859c883fdf85e00313a"),
    "1": ObjectId("4f4ba859c883fdf85e003af2")
   ]
},
"_id": ObjectId("4f4bb608c883fd7860000001"),
"createdat": ISODate("2012-02-27T16: 57: 44.0Z"),

我发现有一个 $pushAll 字段很奇怪,但是,我可以用 $e->getP();

但是,当我尝试将文件附加到 E 时,它阻止了我:

/**
 * @MongoDB\ReferenceMany(targetDocument="P", simple="true")
 * @MongoDB\Index
 */
 protected $p = array();

/** @MongoDB\File */
private $file;

因为当我尝试$e->setFile($filename)持久化/刷新时,我最终会遇到这个错误:

[MongoCursorException]                  
document to insert can't have $ fields  

显然是指那个奇怪$pushAll的领域的错误。

如果我使用这种条目在 MongoDB 中手动修改我的文档:

"p": [
  "0": ObjectId("4f4ba859c883fdf85e00313a"),
  "1": ObjectId("4f4ba859c883fdf85e003af2")
],
"_id": ObjectId("4f4bb608c883fd7860000001"),
"createdat": ISODate("2012-02-27T16: 57: 44.0Z")

...然后一切都很好,我可以保存我的文件而不会出现任何错误。

好的,听起来我错过了一些东西,或者我在这方面没有足够的 RTFM ReferenceMany,但我仍然来这里看看是否有人已经参与其中。

干杯。

4

1 回答 1

2

你可能已经想通了。但是 Doctrine MongoDB ODM 目前在使用 GridFS 集合时遇到了很大的麻烦。参考文献坏了。

于 2012-03-14T14:29:13.633 回答