【问题标题】:Mongoose Query Builder .or not returning expected resultsMongoose 查询生成器。或未返回预期结果
【发布时间】:2018-10-26 19:05:26
【问题描述】:

上下文
我正在构建一个查询,用户可以在其中输入一系列日期来搜索“播放器”文档。查询应返回开始和结束日期与查询日期重叠的任何玩家。我通过使用 OR 条件来执行此操作,其中玩家的结束日期在查询的开始日期之后,或者玩家的开始日期在查询的结束日期之前。查询中的两个日期都是可选的,允许用户仅指定结束日期或开始日期,或者都不返回所有相关文档。

问题
当仅指定两个查询日期之一时,查询有效(请参见下面的屏幕截图)。但是,如果指定了两个日期,它会返回所有文档(功能上忽略两个查询参数)。

代码

let query = Player.find({'casino': user.casino});
let queryArray = [];
if(req.body.startDate) {
        queryArray.push({playerEndDtm: {$gt: moment(req.body.startDate).toDate()}});
}
if(req.body.endDate) {
    queryArray.push({playerStartDtm: {$lt: moment(req.body.endDate).endOf('day').toDate()}});
}
if(queryArray.length > 0) {
    query.or(queryArray);
}

截图
当指定两个查询日期时:
结果:

仅指定 1 个查询日期时:
结果:

谁能帮我确定我做错了什么?谢谢!

【问题讨论】:

  • endate 查询需要 2 个条件。我正在添加作为答案。

标签: javascript mongodb mongoose query-builder or-operator


【解决方案1】:
if(req.body.endDate) {
    queryArray.push({playerStartDtm: {$lt: 
    moment(req.body.endDate).endOf('day').toDate()}});
}

在上面的查询中,您只是检查少于结束日期。您需要检查日期之间的范围:

 ({ playerStartDtm : { $gt :  expression, $lt : expression}})

【讨论】:

  • 我希望查询返回与日期重叠的任何文档。您在上面所做的调整将排除在开始日期之前开始但在其之后结束的玩家。这就是为什么我对结束日期进行单独检查的原因。你是说我在查询日期时需要同时包含 $gt 和 $lt 表达式吗?
  • 是的。查询日期时的 $gt 和 $lt 表达式。因为您正在寻找日期范围。
  • 谢谢。但这仍然不能解释为什么当我只输入一个日期时它会起作用。对此有什么想法吗?
  • 当您查询结束日期时,它是拣货日期而不考虑开始日期。您应该在开始日期之后寻找结束日期。即结束日期总是大于开始日期。当您输入单个日期时,您的查询将有效,因为没有日期边界。
  • 天哪,你是对的。感谢您花时间帮助我理解。
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2016-04-12
相关资源
最近更新 更多