【问题标题】:What is wrong with this mongoose aggregation?这个猫鼬聚合有什么问题?
【发布时间】:2019-08-12 10:24:24
【问题描述】:

我正在尝试使用 moment 对象查询我的 mongodb 集合。文档包含如下所示的日期字段:

  "date" : ISODate("2019-03-21T00:00:00Z"),

这样的普通查询可以正常工作:

  const now = moment().utc()
  console.log(await Price.find({ date: now.startOf('day') }))

但是当我尝试这个时:

  const results = await Price.aggregate([
    { $match: { date: now.startOf('day') } }
  ])

我没有得到任何结果。为什么会这样?

如果查询是{ date: new Date(now.startOf('day')) },我会在聚合中得到结果,这有点奇怪。

【问题讨论】:

  • 根据 mongo 文档,“[$match] 查询语法与读取操作查询语法相同”,这表明错误在于 mongoose 如何转换那些时刻类似日期的对象进入其实际查询的日期。如果您启用 mongoose 调试模式,您应该能够看到它发送给 mongo 的最终查询并进行比较。

标签: mongodb mongoose momentjs


【解决方案1】:

不同之处在于,Mongoose 将根据模型定义的架构为find 转换查询值,但不是aggregate

这在文档here 中有说明:

Mongoose投射管道阶段。

这解释了为什么使用{ date: new Date(now.startOf('day')) } 有效,因为这正是您必须使用aggregate 进行的那种手动转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2012-08-04
    • 2019-11-24
    • 2015-05-19
    • 2017-02-17
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多