我在symfony2.1安装中使用doctrine/mongodb 1.0.0-BETA1.
所以我试图强制我的存储库从我的数据库调用数据,而不是使用它已缓存的对象.
$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
.... do something somewhere to change the object ....
Run Code Online (Sandbox Code Playgroud)
此时如果我打电话
$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
Run Code Online (Sandbox Code Playgroud)
审计数据没有改变.它仍然具有它最初获取的对象.如果我试着
$dm->refresh($audit)
Run Code Online (Sandbox Code Playgroud)
我得到了同样的东西.反正我有没有回到数据库中获取价值?
我正在使用本教程,它提供了有关如何设置CodeIgniter和Doctrine的详细说明.我正在使用CodeIgniter 2.1.0和Doctrine 2.2.1,但是我收到此错误:
致命错误:
Doctrine\Common\Cache\apc_fetch()在第52行的/Applications/XAMPP/xamppfiles/htdocs/emma_watson_shrine/application/libraries/Doctrine/Common/Cache/ApcCache.php中调用未定义的函数
你能帮我吗?
使用MongoDB时,引用数据的非规范化似乎是一种非常常见的做法.然而,我没有看到使用Doctrine MongoDB ODM处理它的任何内置方法.
假设我有一个社交网络,用户可以互相关注,这里有两个示例用户:
{
_id : id1,
name: "Malcolm Reynolds",
followed: []
}
{
_id : id2,
name: "Zoe Alleyne",
followed: [
{ _id: id1, name: "Malcolm Reynolds" }
]
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我希望'name'属性被非规范化.正如我所说,Doctrine ODM似乎没有内置的方法来做到这一点.由于关于这个问题的最新一期是一年,我会尝试自己做.
虽然我在互联网上发现了很多文章,解释了非规范化在什么情况下是有用的,并提到如何保持非规范化数据的一致性,但我没有找到解释如何实现真正的数据更新过程.
在我的情况下,最终一致的数据就足够了,用户名更新和非规范化数据更新之间可能会有几个小时.我可以看到3种不同的方法:
1 - 一致性检查程序:让 后台运行的任务定期更新非规范化数据.
2 - 更新触发器: 名称字段上的每次更新都会在单次刷新中更新所有关联的非规范化数据.
3 - 混合解决方案 对于每个用户,当更新名称时,会将一个条目添加到具有更新信息的队列中(用户更新和队列中的插入将在单个刷新中进行),并且运行任务后台做了实际的更新.
第一个解决方案似乎是最容易实现的,但正如我所看到的那样,它可能非常耗费资源.第二种解决方案会使更新请求变得非常长,即使读/写比率很高,我也可能会遇到这个问题.我认为第三种解决方案是要走的路,我这样认为是对的吗?
另外,我想以干燥的方式进行,例如,我希望不必在preUpdate回调中为每个数据非规范化的Document重写相同的代码.我正在考虑制作自定义注释,这是一个好主意吗?
我正在尝试使用正则表达式在Symfony 2上使用Doctrine的Mongodb ODM来查询Mongodb.
我知道PHP mongo驱动程序可以做到这一点.但是,我不知道如何用Doctrine做到这一点.
我使用同一个班级吗?如何在Symfony中引用MongoRegex?
我想知道是否有相当于MySQL-Query:
"SELECT COUNT(*) FROM users" in MongoDB ODM?
Run Code Online (Sandbox Code Playgroud)
这可能有效:
$qb = $this->dm->createQueryBuilder('Documents\Functional\Users');
$qb->select('id');
$query = $qb->getQuery();
$results = $query->execute();
echo $query->count();
Run Code Online (Sandbox Code Playgroud)
但是,如果数据库中存在更复杂的文档,则不会返回所有ID以及这会如何影响性能.我不想发送大量数据只是为了计算.
我想在Doctrine Mongo ODM中编写一个查询,在两个或多个字段中通过regex进行搜索.在SQL中它看起来像:
SELECT * FROM user WHERE name LIKE %search% OR surname LIKE %search%;
Run Code Online (Sandbox Code Playgroud)
我可以像这样写一个字段的查询:
$qb->field('surname')->equals(new \MongoRegex('/.*'.$this->search.'.*/i'));
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在更多领域进行搜索时,我感到很茫然.
谢谢你的帮助
我正在尝试使用DoctrineMongoDBBundle,但是,我遇到了一个问题.
在我的config.yml中,我有:
doctrine_mongodb:
connections:
default:
server: mongodb://localhost:27017
options:
connect: true
default_database: symfony2
document_managers:
default:
auto_mapping: true
Run Code Online (Sandbox Code Playgroud)
我的User.php类:
<?php
namespace HALL\HelloWorldBundle\Document;
use FOS\UserBundle\Document\User as BaseUser;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document
*/
class User extends BaseUser
{
/** @MongoDB\Id(strategy="auto") */
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行命令时:
php app/console doctrine:mongodb:generate:documents HALLHelloWorldBundle
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
[Doctrine\Common\Annotations\AnnotationException]
[语义错误]类HALL\HelloWorldBundle\Document\User中的注释"@Doctrine\ODM\MongoDB\Mapping\Annotations\Document"不存在,或者无法自动加载.
有什么想法吗?注释被明确引用.
我有一个抽象的父(映射超级)类,它有几个具有不同属性的子节点,我想反序列化.我使用MongoDB和Doctrine ODM存储数据,因此我还有一个discriminator字段,它告诉doctrine使用了哪个子类(并且还有一个自定义的"type"属性ontop,用于确定当前处理的类).
在反序列化我的模型时,我得到一个异常,告诉我不可能创建一个抽象类的实例(ofcourse) - 现在我想知道如何告诉JMS反序列化器继承它应该使用的类(这就是我使用的原因)type例如一个自定义实例变量 - 因为我无权访问doctrine的鉴别器字段映射.
我可以成功地插入preDeserializeEvent- 所以也许可以在那里(或使用)制作一些开关/案例?
我的模型简称(抽象类):
<?php
namespace VBCMS\Bundle\AdminBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use JMS\Serializer\Annotation as Serializer;
/**
* abstract Class Module
* @Serializer\AccessType("public_method")
* @MongoDB\MappedSuperclass
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField(fieldName="_discriminator_field")
* @MongoDB\DiscriminatorMap({
* "module"="Module",
* "text_module"="TextModule",
* "menu_module"="MenuModule",
* "image_module"="ImageModule"
* })
*/
abstract class Module {
const TYPE_MODULE_TEXT = 'module.text';
const TYPE_MODULE_MENU = 'module.menu';
const TYPE_MODULE_MEDIA_ITEM = 'module.media.item';
/**
* @Serializer\Type("string")
* @MongoDB\Field(type="string")
* @var String
*/
protected $type;
/**
* …Run Code Online (Sandbox Code Playgroud) 如何使用Doctrine ODM创建一对一的双向引用,在使用除主键之外的字段进行引用时延迟加载?
我在MongoDB中有两个文档,Article和ArticleMetaData.对于每个文章文档,都有一个ArticleMetaData,反之亦然.(OneToOne双向关系.)由于遗留原因,这两种文档类型需要位于不同的集合中.两个集合都由不了解Mongo ID的外部系统更新.然而,它们包含共享字段"groupcode",可用于将正确的文章与其元数据相匹配.
我尝试以这样的方式配置Doctrine,即我可以从其元数据对象获取文章对象和文章的元数据,但我想让它们延迟加载.(当我不需要时,不需要查询另一端.)
映射如下:
Foo\BarBundle\Document\Article:
repositoryClass: Foo\BarBundle\Repository\ArticleRepository
changeTrackingPolicy: DEFERRED_EXPLICIT
collection: article
type: document
fields:
id:
id: true
groupcode:
type: int
index: true
unique:
order: asc
...
referenceOne:
metaData:
targetDocument: Foo\BarBundle\Document\ArticleMetaData
mappedBy: groupcode
repositoryMethod: findOneByArticle
Foo\BarBundle\Document\ArticleMetaData:
repositoryClass: Foo\BarBundle\Repository\ArticleMetaDataRepository
changeTrackingPolicy: DEFERRED_EXPLICIT
collection: article_meta
fields:
id:
id: true
groupcode:
type: int
index: true
unique:
order: asc
...
referenceOne:
article:
targetDocument: Foo\BarBundle\Document\Article
mappedBy: groupcode
repositoryMethod: findOneByMetaData
Run Code Online (Sandbox Code Playgroud)
以及上面提到的存储库方法:
// In the ArticleRepository
public function findOneByMetaData(ArticleMetaData $metadata)
{
$article = $this
->createQueryBuilder()
->field('groupcode')->equals($metadata->getGroupcode())
->getQuery() …Run Code Online (Sandbox Code Playgroud) doctrine-odm ×10
mongodb ×4
php ×4
symfony ×4
doctrine ×3
doctrine-orm ×3
codeigniter ×1
odm ×1
symfony-2.1 ×1
terminal ×1