【问题标题】:doctrine odm, find document where id is not object id教义 odm,查找 id 不是对象 id 的文档
【发布时间】:2014-01-12 15:11:02
【问题描述】:

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

但是,这样的 Icecream 文档是这样的:

{
   "_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"} [] []

有人知道吗?

【问题讨论】:

    标签: php mongodb symfony doctrine-orm doctrine


    【解决方案1】:

    如果您有自己的字符串 _id(一个 NOT MongoId 对象),您可能希望使用 Id 的“策略”属性。

    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

    【讨论】:

    • 这在我创建一个 id=1 的对象时有效,但在我添加策略之前,Doctrine 不会在 Symfony Bundle 中找到它...->find(1)
    【解决方案2】:

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

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

    我正在使用以下内容:

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

    【讨论】:

      【解决方案3】:

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

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

      那么idstring就是字符串表示

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2014-04-02
        • 1970-01-01
        相关资源
        最近更新 更多