2017-03-24 5 views
0

を私は教義に

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(); 

このコードで何が問題なのですか?

+0

私はPHPの専門家ではありませんが、$やステートメントを作成しているときに正しい配列を渡していますか? –

答えて

0

私はDoctrineのODMに慣れていないんだけど、それは私はそれはまた、ORM-QueryBuilderと同様の方法expr()を持っていると仮定しQueryBuilderがあるので:あなたができるexprのクラスで

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class

をあなたは、元のQueryBuilderオブジェクトにあなたのネストされた条件を追加しているためです

->where(
    $builder->expr()->or(
     $builder->expr()->and(
      $builder->expr()->isNull('reservedAt'), 
      $builder->expr()->lte('availableAt', $currentTime), 
     ), 
     $builder->expr()->lte('reservedAt', $expirationDate) 
    ) 
); 
0

:このようなネストされたクエリを構築します。入れ子になったパラメータを持つaddAndメソッドとaddOrメソッドを使用している場合でも、トップレベルのビルダーには変わっているので、それらの条件で何をしようとしているのか混乱しています。

このような何か試してみてください:

$builder 
    ->findAndUpdate() 
    ->addAnd([ 
     $builder->expr()->field('queue')->equals($queue), 
     $builder->expr()->addOr([ 
      $builder->expr()->addAnd([ 
       $builder->expr()->field('reservedAt')->equals(null), 
       $builder->expr()->field('availableAt')->lte($currentTime) 
      ]), 
      $builder->expr()->field('reservedAt')->lte($expiration) 
     ]) 
    ]); 

それはどのようなexprの(理解することが重要です)を行い、それがビルダーオブジェクトを行うには何もを持っていない表現オブジェクトを作成する簡単なファクトリメソッド以外の何ものでもありませんそれを呼んだ。

$builder->expr() 

それはきちんと一緒にすべてを結びつけるaddAndとaddOr方法だ

(new Expr()) 

のと同等です。 expr()メソッドはちょうどそこにあるので、querybuilderのメンテナーはExpressionのクラスと依存関係の注入を心配するかもしれませんが、builderをよく知らない人にとってはexpr()メソッドの重要性を難読化する可能性があります。

0

私は適用whle不正な値の問題の似たようなものを持っていた$または$と$の条件配列を解きながら一緒にちょうどそれが解決された、それはあなたを助けるかもしれない私のコードの例を取る:

$condition['$or'] = [ 
      ['assigned_to' => (int)$id, 
       'type' => "customer", 
       'assigned_date' => ['$gte'=>$mDate], 
      ], 
      ['assigned_to' => 0, 
       'read' => 'no', 
       'type' => "customer", 
       'assigned_date' => ['$gte'=>$mDate], 
      ] 
     ]; 

問題のみ私はPHPクラスでMongoを使用しました。

関連する問題