Doctrine Mongodb ODM在聚合中添加动态日期



我想知道日期范围内的特定摩托车是否有合同。

我的模式看起来像:

{"_id":ObjectId("575b7c0b0419c906e262d54b"),"客户":{"id":ObjectId("575b7c0b0419c906e262d54b")},"name":"哈雷商店","description":"哈雷商店","合同":[{"_id":ObjectId("575b7c0b0419c906e262d54b"),"自行车":{"id":ObjectId("575b7c0b0419c906e262d54b")},"from":ISODate("2050-01-01T00:00:00.000Z"),"till":ISODate("2050-01-05T000:00:00.000Z"),"成本":10000,"失效":[ISO日期("2050-01-01T00:00:00.000Z"),ISO日期("2050-01-02T00:00:00.000Z"),ISO日期("2050-01-03T00:00:00.000Z"),ISO日期("2050-01-04T00:00:00.000Z"),ISO日期("2050-01-05T000:00:00.000Z")]},{"_id":ObjectId("575b7c0b0419c906e262d54c"),"自行车":{"id":ObjectId("575b7c0b0419c906e262d54c")},"from":ISODate("2050-01-01T00:00:00.000Z"),"till":ISODate("2050-01-05T000:00:00.000Z"),"成本":10000,"失效":[ISO日期("2050-01-06T000:00:00.000Z"),ISO日期("2050-01-07T000:00:00.000Z"),ISO日期("2050-01-08T00:00:00.000Z"),ISO日期("2050-01-09T000:00:00.000Z")]}]}

我在mongo shell中有以下查询:

db.getCollection('BikeStore').agregate([{$unroll:'$contracts'},{$项目:{contract:'$contracts',_id:0}},{$match:{'contract.bike.id':ObjectId("575b7c0b0419c906e262d54b")}},{$match:{$或:[{'合同失效':{$eq:ISODate("2049-01-31T0:00.000Z")},{'合同失效':{$eq:ISODate("2050-02-01T00:00:00.000Z")},{'合同失效':{$eq:ISODate("2050-02-02T00:00:00.000Z")}]}}])

mongoshell中的查询运行良好,但日期是从till动态生成的,我找不到使用查询生成器完成这项工作的方法。

我的查询生成器:

公共函数hasContracts(字符串$bikeId,\DateTime$from,\DateTime$till):bool{$filterDate=\DateTimeImmutable::createFromMutable($from);$days=$from->diff($till)->days;$qb=$this->createAggregationBuilder();$qb->解除('$contracts');$qb->project()->字段("合同")->表达式('$contracts')->字段('_id')->表达式(0);$qb->match()->field('contract.bike.id')->equals(new ObjectId($bikeId));对于($i;$days){//$i或等于$days$qb->match()->addOr($qb->matchExpr()->field('contract.lapse')->equals(新UTCDateTime($filterDate->add(\DateInterval::createFromDateString(sprintf("%d天",$i))->setTime(0,0)->getTimestamp()*1000)));}return 0!==$qb->execute()->count();}

生成odm的查询如下:

{"聚合":true,"管道":[{"$undup":"$contracts"},{"$project":{"contract":"$contracts","_id":0}},{"$match":{"contract.bike.id":{"$oid":"575b7c0b0419c906e262d54b"}}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2524780800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"252486720000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2524953600000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525040000000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525126400000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525212800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"25252992000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525385600000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525472000000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525558400000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525644800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525731200000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525817600000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525904000000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2525990400000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526076800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526163200000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526249600000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526336000000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526422400000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526508800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526595200000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526681600000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526768000000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526854400000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2526940800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2527027200000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2527113600000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2527200000000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2527286400000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2527372800000"}}}]}},{"$match":{"$或":[{"合同失效":{"$date":{"$numberLong":"2527459200000"}}}]}}],"选项":{"cursor":true},"db":"store","收藏":"BikeStore"}

如何将日期动态添加到匹配中而不重复匹配?

谢谢你的帮助!!!

每次调用$qb->match()都会创建一个新的$match阶段。这应该做到:

$qb->match();
for($i;$days){ //$i menor or equal $days
$qb->addOr(/* ... */);
}

最新更新