doctrine odm,找到id不是对象id的文档

时间:2014-01-12 15:11:02

标签: php mongodb symfony doctrine-orm doctrine

在我的mongodb中我有一个集合,其中id-field不是object-Id 我不知道为什么它是这样的构建,我不能从头开始改变它因为可能很多软件已经在使用这种模式。

然而,这就是冰淇淋文件的样子:

{
   "_id": "52d0283ae4b01db941dd763b",
   "insertDate": ISODate("2014-01-10T17:04:58.617Z"),
   "language": "en",
   "profile": ObjectId("50e577602b5e05e74b38a6c8"),
   "related": ObjectId("516c0061975a299edc44b419"),
   "survey": ObjectId("516c0061975a299edc44b409"),
   "version": NumberInt(0) 
}

和mongoshell我可以找到它:

 db.icecream.find({"_id":"52d0283ae4b01db941dd763b"})

而不是使用:

 db.icecream.find({"_id":ObjectId("52d0283ae4b01db941dd763b")})

所以我尝试了很多查询来找到它,但是教条odm总是没有正确的查询,这是我最近的尝试:

  return $this->mongo->getManager()
    ->getRepository('DocumentBundle:Icecream')
    ->findOneBy(array('_id' => (string)$answerId));

返回

   doctrine.INFO: MongoDB query: {"find":true,"query":{"_id":{"$id":"52ced410e4b0fcc3da3a0c8b"}},"fields":[],"db":"myIcecreamDb","collection":"icecream"} [] []

任何人都有任何想法?

提前感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

如果你有自己的字符串_id(一个NOT MongoId对象),你可能想要使用Id的'strategy'属性。

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/** @ODM\Document */
class MyPersistentClass
{
    /** @ODM\Id(strategy="NONE") */
    private $id;

    public function setId($id) {
        $this->id = $id;
    }    
}

您可以在此处查看文档中的更多选项: http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/basic-mapping.html#basic-mapping-identifiers

答案 1 :(得分:2)

好吧,我通过以下映射解决了这个问题

/**
 * @MongoDB\Field(type="string",name="_id")
 */
protected $idstring;

/**
 * @MongoDB\Id
 */
protected $id2;

然后idstring是字符串表示

答案 2 :(得分:2)

我刚碰到这个。似乎Doctrine缓存了一些映射。我刚从常规的MongoId切换到字符串id,每当我运行查询时,Doctrine都会继续尝试将我的字符串id转换为MongoID(如您所述)。结果没有找到结果。

我清除了所有缓存并修复了它 - Doctrine现在只使用常规字符串id。

我正在使用以下内容:

/**
 * @MongoDB\Id(strategy="NONE", type="string")
 */
private $id;