我想知道在日期范围内的特定摩托车是否有合同。
我的架构如下所示:
{ "_id" : ObjectId("575b7c0b0419c906e262d54b"), "customer" : { "id" : ObjectId("575b7c0b0419c906e262d54b") }, "name" : "Harley Store", "description" : "Harley Store", "contracts" : [ { "_id" : ObjectId("575b7c0b0419c906e262d54b"), "bike" : { "id" : ObjectId("575b7c0b0419c906e262d54b") }, "from" : ISODate("2050-01-01T00:00:00.000Z"), "till" : ISODate("2050-01-05T00:00:00.000Z"), "cost" : 10000, "lapse" : [ ISODate("2050-01-01T00:00:00.000Z"), ISODate("2050-01-02T00:00:00.000Z"), ISODate("2050-01-03T00:00:00.000Z"), ISODate("2050-01-04T00:00:00.000Z"), ISODate("2050-01-05T00:00:00.000Z") ] }, { "_id" : ObjectId("575b7c0b0419c906e262d54c"), "bike" : { "id" : ObjectId("575b7c0b0419c906e262d54c") }, "from" : ISODate("2050-01-01T00:00:00.000Z"), "till" : ISODate("2050-01-05T00:00:00.000Z"), "cost" : 10000, "lapse" : [ ISODate("2050-01-06T00:00:00.000Z"), ISODate("2050-01-07T00:00:00.000Z"), ISODate("2050-01-08T00:00:00.000Z"), ISODate("2050-01-09T00:00:00.000Z") ] } ] }
我在mongo shell中有以下查询:
db.getCollection('BikeStore').aggregate([ { $unwind:'$contracts' }, { $project:{ contract:'$contracts', _id: 0 } }, { $match:{ 'contract.bike.id': ObjectId("575b7c0b0419c906e262d54b") } }, { $match:{ $or: [ {'contract.lapse': {$eq: ISODate("2049-01-31T00:00:00.000Z")}}, {'contract.lapse': {$eq: ISODate("2050-02-01T00:00:00.000Z")}}, {'contract.lapse': {$eq: ISODate("2050-02-02T00:00:00.000Z")}} ] } } ])
mongo shell中的查询工作很好,但是日期是从-till动态生成的,我无法找到使用query Builder完成此操作的方法。
我的查询生成器:
public function hasContracts(string $bikeId, \DateTime $from, \DateTime $till): bool { $filterDate = \DateTimeImmutable::createFromMutable($from); $days = $from->diff($till)->days; $qb = $this->createAggregationBuilder(); $qb->unwind('$contracts'); $qb->project() ->field('contract') ->expression('$contracts') ->field('_id') ->expression(0); $qb->match()->field('contract.bike.id')->equals(new ObjectId($bikeId)); for($i;$days){ //$i menor or equal $days $qb->match()->addOr( $qb->matchExpr()->field('contract.lapse')->equals( new UTCDateTime( $filterDate->add( \DateInterval::createFromDateString(sprintf('%d day', $i))) ->setTime(0, 0)->getTimestamp() * 1000 ) ) ); } return 0 !== $qb->execute()->count(); }
生成odm的查询如下:
{ "aggregate": true, "pipeline": [ { "$unwind": "$contracts" }, { "$project": { "contract": "$contracts", "_id": 0 } }, { "$match": { "contract.bike.id": { "$oid": "575b7c0b0419c906e262d54b" } } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2524780800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2524867200000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2524953600000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525040000000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525126400000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525212800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525299200000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525385600000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525472000000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525558400000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525644800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525731200000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525817600000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525904000000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2525990400000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526076800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526163200000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526249600000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526336000000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526422400000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526508800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526595200000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526681600000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526768000000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526854400000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2526940800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2527027200000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2527113600000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2527200000000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2527286400000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2527372800000" } } } ] } }, { "$match": { "$or": [ { "contract.lapse": { "$date": { "$numberLong": "2527459200000" } } } ] } } ], "options": { "cursor": true }, "db": "store", "collection": "BikeStore" }
如何将日期动态添加到匹配中而不重复匹配?
Thx帮你!!!
每次调用$qb->match()
时,您都在创建一个新的$match
阶段。这样做应该是:
$qb->match();
for($i;$days){ //$i menor or equal $days
$qb->addOr(/* ... */);
}
编辑 删除这一行后,将在控制台上打印日志。但是,我看不到正在创建的文件。
我目前有以下数据帧; 我要做的是创建一个如下所示的dataframe; 其中,每当“感情”列中的值为“正”时,就会添加1,每当它为负时,就会从新创建的sentiment_score列中扣除1。最后,数据帧将被聚合成每个日期的股票及其相应的情绪得分。 然而,我的问题是我知道如何在Excel中这样做,但我刚刚开始使用Python,因此对如何在Excel中这样做几乎一无所知。 任何帮助都将非常感谢!
我有一个elasticsearch请求如下: 我想在这个请求中添加分页,就像 我搜索了很多,找到了一个关于它的链接:https://github.com/elastic/elasticsearch/issues/4915. 但我仍然没有得到实现方法。 有没有办法通过Elasticsearch本身而不是我的应用程序来实现它?
问题内容: 我在MySQL中有一张表。将表中的当前日期值添加为2天的sql语句看起来像什么? 这会增加一秒钟的值,我不想更新时间,我想增加两天? 问题答案: 假设您的字段是一种类型(或相似类型): 使用您提供的示例,它看起来可能像这样: 这种方法也适用。
问题内容: 我有一个包含时间戳名为RDD 时间 长整型: 我正在尝试按值1,值2和时间分组为YYYY-MM-DD。我尝试按演员分组(时间为日期),但随后出现以下错误: 这是否意味着无法按日期分组?我什至尝试添加另一级别的强制转换以将其作为字符串: 哪个返回相同的错误。 我已经读到我可以在RDD上使用gregationByKey,但我不明白如何在几列中使用它并将其转换为YYYY-MM-DD字符串。我
问题内容: 我知道我可以通过执行以下操作来向对象动态添加实例方法: 稍后我可以打电话给我,自我将被正确绑定,一切正常。 现在,我的问题是:如何做完全相同的事情来获得用@property装饰新方法的行为? 我猜是这样的: 但是,这样做会返回一个属性对象。 问题答案: 在描述对象需要住 类 , 未 在 实例中 ,有你想要的效果。如果您不想更改现有的类以避免更改其他实例的行为,则需要创建“每个实例的类”