标签: doctrine-odm

Doctrine Mongo更新$ pull查询无效

我正在尝试使用$pull更新查询删除对文档的引用(为了删除所述文档)但是似乎没有发生任何事情.

我可以手动运行以下Mongo查询

db.collection.update({}, {
    $pull: {
        'field': {'$id': ObjectId("xxxxxxxx")}
    }
}, false, true)
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.尝试在Doctrine的ODM中执行相同的操作既不会产生预期结果,也不会产生任何错误消息.这是我们到目前为止所拥有的

$id = new MongoId("xxxxxxxx");

$qb = $repo->createQueryBuilder();
$qb->update();
$qb->field('field')->pull(array('$id' => $id));
$qb->getQuery()->execute();
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么的暗示?

php doctrine mongodb doctrine-odm

2
推荐指数
1
解决办法
1402
查看次数

如何正确自动加载Doctrine ODM注释?

试图运行命令行工具w/odm:schema:create我收到的错误如下:

"[Semantical Error] The annotation "@Document" in class Company_Model_Auth was never imported. Did you maybe forget to add a "use" statement for this annotation?" and
"[Semantical Error] The annotation "@EmbeddedDocument" in class Company_Model_Auth was never imported. Did you maybe forget to add a "use" statement for this annotation?"
Run Code Online (Sandbox Code Playgroud)

以及其他,基本上每个注释.

当我添加"use\Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument;"时 (或\ Document)到它工作的文件并前进到下一个Model.然后它将在下一个文件中抱怨缺少相同的类(Document/EmbeddedDocument和任何其他注释).我是否需要将use语句添加到每个文件中?

这是我如何构建我的DocumentManager ::

public function _initDm() 
{
        AnnotationDriver::registerAnnotationClasses();
        $config = new Configuration();
        $config->setProxyDir(APPLICATION_PATH . '/../data/Proxies');
        $config->setProxyNamespace('Proxies');
        $config->setHydratorDir(APPLICATION_PATH . '/../data/Hydrators');
        $config->setHydratorNamespace('Hydrators');
        $config->setMetadataDriverImpl(AnnotationDriver::create(APPLICATION_PATH . '/models'));     

        // Pull in mongo db connection …
Run Code Online (Sandbox Code Playgroud)

php zend-framework mongodb doctrine-odm

2
推荐指数
1
解决办法
2405
查看次数

在doctrine-mongodb中的preUpdate事件中创建/保留新文档

我正在使用doctrine-mongodb-odm-1.0.0-BETA10并尝试提供一些基于事件运行\InitialDocument时的自定义逻辑preUpdate

假设\InitialDocument获得了某种状态,该状态必须表现为 new 的初始状态\StateDocument。我正在做这样的事情:

class InitDocListener implements \Doctrine\Common\EventSubscriber {
    public function getSubscribedEvents()
    {
        return [
            Events::preUpdate
        ];
    }

    public function preUpdate($args){
        $document = $args->getDocument();
        if($document instanceOf InitialDocument && $document->getState() == 'mine'){
            $stateDocument = new \StateDocument();
            $stateDocument->setInitDocument($document);
            $args->getDocumentManager()->persist($stateDocument);
            //no flush cause recursion happens
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

prePersist事件\StateDocument发生,但它不会将新文档保留在数据库中。因此postPersist事件永远不会被触发。

还有一些更多的自定义逻辑,但都在事件范围内。在某些时候,该逻辑可能会抛出异常,该异常必须停止更新事件,InitialDocument因此InitialDocument状态取决于\StateDocument业务范围的创建过程。

我怎么解决这个问题?preFlush在changeSet重新计算之前运行的事件不确定InitialDocument实例。所以这是一种“搜索”更新的技巧preFlush,让我认为这不是正确的方法。请给我一个合适的建议。谢谢。

php mongodb odm doctrine-odm doctrine-mongodb

2
推荐指数
1
解决办法
1609
查看次数

使用Doctrine ODM从mongodb文档中的数组中删除项目

我有一个包含以下结构的mongoDB文档:

{
        "_id" : ObjectId("537b9731fa4634134c8b45aa"),
        "kpis" : [
                {
                        "id" : 4,
                        "value" : 3.78,
                        "entered" : Timestamp(1401377656, 9)
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

我想删除ID为x的所有kpi文档。使用pull命令直接在数据库上执行此操作非常简单:

db.lead.update({}, {$pull:{"kpis":{id:5}}}, {multi:true});
Run Code Online (Sandbox Code Playgroud)

但是,我(几次)尝试使用教义ODM匹配此语法失败:

    $qb->update()
       ->field('kpis')
       ->pull($qb->expr()->field('kpis.id')->equals($kpi->getId()))
       ->multiple(true)
       ->getQuery()
       ->execute();

    // I've also tried..

    $qb->update()
       ->field('kpis')
       ->pull($qb->expr()->field('kpis')->elemMatch(
            $qb->expr()->field('kpis.id')->equals($kpi->getId())
        ))
       ->multiple(true)
       ->getQuery()
       ->execute();
Run Code Online (Sandbox Code Playgroud)

什么都没有删除。我是否正确使用查询生成器?

php doctrine mongodb doctrine-odm

2
推荐指数
1
解决办法
1614
查看次数

如何配置Monolog以使用Symfony2和Doctrine将日志存储到MongoDB中

是否有可能获得一个完整的例子,说明如何配置Monolog以使用Symfony 2.6和Doctrine 2将其日志存储到MongoDB中?

mongodb symfony doctrine-orm doctrine-odm monolog

2
推荐指数
1
解决办法
3052
查看次数

独特的指数与学说mongodb odm

我正在为我的网站做一个注册系统,并希望防止使用相同的电子邮件地址重复注册.

用户类的声明如下所示:

/**
 * @Document
 */
class User extends BaseEntity
{
    private 
    /**
     * @Id
     */
    $id,

    /**
     * @String @Index(unique=true)
     */    
    $email
;
}
Run Code Online (Sandbox Code Playgroud)

但每当我使用相同的电子邮件保存用户时,不会引发异常,我会得到重复.

我找到了我需要做的地方$ documentManager-> flush(array('safe'=> true)); 但这没有用.

我怎样才能实现我的需要?谢谢

doctrine mongodb doctrine-odm

1
推荐指数
1
解决办法
2772
查看次数

Doctrine ODM/MongoDB没有重试查询?

我正在使用Doctrine ODM连接到MongoDB.我有一个三节点副本集:两个fulls和一个仲裁器.复制仅用于提高可用性,我不寻求跨节点分发读取.我的应用程序MongoCursorException经常使用消息进行日志记录not master and slaveok=false.我没有看到任何证据表明mongodb日志中发生了故障转移事件,并且主要事件没有发生变化.更正:确实发生了故障转移,但是例外情况not master and slaveok=false经常出现,甚至在新主要成功当选后6小时出现.

该怎么办?我看到我们的doctrine-mongodb版本包含(实验?)重试功能,但我没有看到一种简单的方法来启用它.

不确定它是否重要,但这是一个Symfony2(v2.0)应用程序.

https://groups.google.com/d/topic/mongodb-user/6p710Rdycpg/discussion意味着我们需要重试(强调我的):

您的应用程序必须写入重新连接/重试,因为有任何数量的瞬态(网络)错误可能会像正常操作期间的滚动升级过程那样出现.

蒙戈PHP扩展文档似乎考虑到这一点:

如果第一次尝试因某些原因失败,驱动程序将自动重试"普通"查询(而不是命令)几次.这是为了减少副本集故障转移期间的异常(尽管您可能仍需要处理一些故障转移)并掩盖瞬态网络问题.

我认为doctrine-mongodb只是使用PHP扩展实际上与mongod交谈.所以我有点困惑,我是否应该担心重试配置.

我想我解决了部分问题:我根据Kristina Chodorow的建议从连接字符串中删除了仲裁器.我不再看到任何有消息的了.我可能一直在点击https://jira.mongodb.org/browse/PHP-392.MongoCursorExceptionnot master and slaveok=false

但是,在故障转移期间,我仍然会收到一些MongoCursorException消息couldn't determine master.例如,我刚刚进行了故障转移; 基于mongod日志,几秒后就选出了一个新的主服务器,但Web应用程序甚至在5分钟后就抛出了异常.

php doctrine mongodb doctrine-odm

1
推荐指数
1
解决办法
2488
查看次数

如何在Doctrine ODM和MongoDbSessionHandler之间共享\ Mongo实例?

我正在尝试使用MongoDB来存储我的会话,我需要获得对该\Mongo实例的引用.

但显然它并未被宣布为服务.相反,doctrine在包装器中创建它.

那我该怎么办呢?我试过这个:

services:
    mongo.connection:
        class: MongoDoctrine\MongoDB\Connection
        factory_service: doctrine.odm.mongodb.document_manager
        factory_method: getConnection
    mongo:
        class: Mongo
        factory_service: mongo.connection
        factory_method: getMongo
Run Code Online (Sandbox Code Playgroud)

但有时它返回null,它也与我的logger预处理器冲突,后者将request_id添加到日志中,我认为这与会话有关.

有任何想法吗?

php dependency-injection mongodb symfony doctrine-odm

1
推荐指数
1
解决办法
1265
查看次数

Doctrine ODM返回基类的代理对象而不是子类文档

在我为项目提供新功能的过程中,我决定扩展模型.我决定使用基类,将常用方法分组,只有很少的子类,所有子类都保存在一个集合中.

基础,抽象类:

/**
* @MongoDB\Document(repositoryClass="EntryRepository")
* @MongoDB\MappedSuperclass
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField(fieldName="type")
* @MongoDB\DiscriminatorMap({"entry"="Application_Model_Entry", "image"="Application_Model_Image", "movie"="Application_Model_Movie"})
*/
abstract class Application_Model_Entry
{
    abstract function foo();
}
Run Code Online (Sandbox Code Playgroud)

一些具体的类(我有更多,类似,但有些是抽象的):

<?php
/** @MongoDB\Document */
class Application_Model_Image extends Application_Model_Entry
{
    function foo()
    {
        return 'foo';
    }
}
Run Code Online (Sandbox Code Playgroud)

在转换之后,我打开了我的索引页面,并且出现了错误 - PHP试图调用抽象方法,因为Doctrine返回的对象是类的代理.我想这是因为我从改名为收集Application_Model_ImageApplication_Model_Entry和内部对象引用($ref领域DBRef)仍然指向Application_Model_Image,但我注意到一些有趣的:总是第一个查询结果的具体类的适当的文件,其余的都是基类代理 - 从数据库中删除第一个对象后,第二个对象变好了.

在单个对象显示页面上,对于所有对象,一切正常,所以我想也许是Zend Framework的寻呼机类迭代结果,所以我跳过了寻呼机并直接从查询中转储了对象.我打印出100个第一个结果的类,其中一些有适当的类(在pastebin上的那个列表的片段).我查看了数据库,但我注意到数据没什么特别的(工作不工作).我想也许引用可能有问题,但正如我上面所写,如果它首先出现在结果列表中,那么同一个对象可能会起作用.

任何想法或提示?我可以调试更多,但我需要被告知在哪里查看Doctrine的代码.

php doctrine mongodb odm doctrine-odm

1
推荐指数
1
解决办法
1184
查看次数

作曲家为什么抱怨ext-mongo扩展?

当我尝试使用composer安装doctrine / mongodb-odm-bundle和doctrine / mongodb时,将引发错误。

composer require doctrine/mongodb-odm-bundle doctrine/mongodb
Run Code Online (Sandbox Code Playgroud)
Using version ^3.5 for doctrine/mongodb-odm-bundle
Using version ^1.6 for doctrine/mongodb
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - doctrine/mongodb 1.6.3 requires ext-mongo ^1.6.7 -> the requested PHP extension mongo is missing from your system.
    - doctrine/mongodb 1.6.2 requires ext-mongo ^1.6.7 -> the requested PHP extension mongo is missing from your …
Run Code Online (Sandbox Code Playgroud)

php symfony doctrine-odm composer-php

1
推荐指数
1
解决办法
269
查看次数