当前位置: 首页 > 知识库问答 >
问题:

Mongodb ODM在聚合中添加动态日期的原则

董喜
2023-03-14

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

我的架构如下所示:


    {
        "_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帮你!!!

共有1个答案

鲜于德业
2023-03-14

每次调用$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装饰新方法的行为? 我猜是这样的: 但是,这样做会返回一个属性对象。 问题答案: 在描述对象需要住 类 , 未 在 实例中 ,有你想要的效果。如果您不想更改现有的类以避免更改其他实例的行为,则需要创建“每个实例的类”