我正试图隐藏这个问题
db.getCollection('queues').find({
$and:[
{queue: 'testo'},
{$or: [
{$and: [{reserved_at: null}, {available_at:{'$lte':1490323024}}]},
{reserved_at:{'$lte':1490323024}}
]}
]
});
但我得到了这个错误。
Can't canonicalize query: BadValue $or/$and/$nor entries need to be full objects.
这就是我所尝试的。
$builder = $this->get('doctrine_mongodb')->getManager()->createQueryBuilder('AppBundle:Ticket');
$builder->findAndUpdate()->addAnd([
$builder->field('queue')->equals($queue),
$builder->addOr([
$builder->addAnd([
$builder->field('reservedAt')->equals(null),
$builder->field('availableAt')->lte($currentTime)
]),
$builder->field('reservedAt')->lte($expiration)
])
])
->sort('id', 'ASC')
->limit(1)
->field('reservedAt')->set($currentTime->getTimestamp());
$job = $builder->getQuery()->execute()->toArray();
这个代码有什么问题吗?有人能给予我任何提示吗?
3条答案
按热度按时间wqsoz72f1#
我不熟悉Doctrine的ODM,但由于它有一个QueryBuilder,我假设它也有一个类似于ORM-QueryBuilder的方法
expr()
:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class
使用expr-class,您可以建立巢状查询,如下所示:
5uzkadbs2#
这是因为您要将嵌套条件添加到原始QueryBuilder对象中。即使您使用带有嵌套参数的addAnd和addOr方法,您仍然在改变顶级构建器,因此它会对您要对这些条件执行的操作感到困惑。
请尝试以下操作:
了解expr()的作用非常重要,它只是一个简单的工厂方法,用于创建与调用它的构建器对象 * 无关 * 的Expression对象。
相当于
addAnd和addOr方法将所有东西紧密地联系在一起。expr()方法的存在只是为了让querybuilder的维护者担心Expression的类和依赖注入,但对于不太了解构建器的人来说,它可能会混淆expr()方法的重要性。
9bfwbjaz3#
我有类似的问题,坏值whle应用$or和$和一起只是举一个例子,我的代码,它可能会帮助你,它是解决了,而解决$条件数组:
问题只在数组的形式。我用Mongo与PHP类。