我正在尝试使用$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)
关于我做错了什么的暗示?
试图运行命令行工具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) 我正在使用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,让我认为这不是正确的方法。请给我一个合适的建议。谢谢。
我有一个包含以下结构的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)
什么都没有删除。我是否正确使用查询生成器?
是否有可能获得一个完整的例子,说明如何配置Monolog以使用Symfony 2.6和Doctrine 2将其日志存储到MongoDB中?
我正在为我的网站做一个注册系统,并希望防止使用相同的电子邮件地址重复注册.
用户类的声明如下所示:
/**
* @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 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分钟后就抛出了异常.
我正在尝试使用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添加到日志中,我认为这与会话有关.
有任何想法吗?
在我为项目提供新功能的过程中,我决定扩展模型.我决定使用基类,将常用方法分组,只有很少的子类,所有子类都保存在一个集合中.
基础,抽象类:
/**
* @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_Image到Application_Model_Entry和内部对象引用($ref领域DBRef)仍然指向Application_Model_Image,但我注意到一些有趣的:总是第一个查询结果的具体类的适当的文件,其余的都是基类代理 - 从数据库中删除第一个对象后,第二个对象变好了.
在单个对象显示页面上,对于所有对象,一切正常,所以我想也许是Zend Framework的寻呼机类迭代结果,所以我跳过了寻呼机并直接从查询中转储了对象.我打印出100个第一个结果的类,其中一些有适当的类(在pastebin上的那个列表的片段).我查看了数据库,但我注意到数据没什么特别的(工作与不工作).我想也许引用可能有问题,但正如我上面所写,如果它首先出现在结果列表中,那么同一个对象可能会起作用.
任何想法或提示?我可以调试更多,但我需要被告知在哪里查看Doctrine的代码.
当我尝试使用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) doctrine-odm ×10
mongodb ×9
php ×8
doctrine ×5
symfony ×3
odm ×2
composer-php ×1
doctrine-orm ×1
monolog ×1