使用多个 $or 运算符的 MongoDB 查询未返回预期结果

问题描述 投票:0回答:2

原始查询有效,但添加额外的 $or 条件失败

我有一个 MongoDB 查询成功返回 2 个结果:

{
  "state": "Review",
  "type": "Test",
  "subtype": { "$in": ["dr_visit", "annual_physical", "psychiatric_visit"] },
  "archived": false,
  "data.visitInformation.dateOfVisit": { "$gte": "2024-11-19T00:00:00.000Z" },
  "deleted": false,
  "$or": [
    { "account": "5dad84a4de014f0011999e27" },
    { "referral.user": "66cd7113e3887e0015522f05", "referral.accepted": true },
    { "referral.account": "5dad84a4de014f0011999e27", "referral.accepted": true }
  ]
}

此查询有效并检索预期的 2 个文档。

现在,我想修改查询以包含另一个条件:检查

data.visitInformation.dateOfVisit
子句中的 data.overview.visitDate
$or
。这两个字段永远不会出现在同一个文档中——它们是不同文档类型的一部分。但是,当我尝试以下查询时,它没有返回结果:

{
  "state": "Review",
  "type": "Test",
  "subtype": { "$in": ["dr_visit", "annual_physical", "psychiatric_visit"] },
  "archived": false,
  "deleted": false,
  "$and": [
    {
      "$or": [
        { "account": "5dad84a4de014f0011999e27" },
        { "referral.user": "66cd7113e3887e0015522f05", "referral.accepted": true },
        { "referral.account": "5dad84a4de014f0011999e27", "referral.accepted": true }
      ]
    },
    {
      "$or": [
        { "data.visitInformation.dateOfVisit": { "$gte": "2024-11-19T00:00:00.000Z" } },
        { "data.overview.visitDate": { "$gte": "2024-11-19T00:00:00.000Z" } }
      ]
    }
  ]
}

问题

即使原始查询有效,此查询也不会返回任何结果。我怀疑这与 MongoDB 如何处理

$and
$or
组合有关,特别是因为
data.visitInformation.dateOfVisit
data.overview.visitDate
属于不同的文档类型。

问题

有没有办法达到想要的结果,其中查询:

  • data.visitInformation.dateOfVisit
    data.overview.visitDate
    ,
  • 匹配文档
  • 并且满足
    $or
    account
    字段的
    referral
    条件?

非常感谢任何建议或见解!

node.js mongodb mongoose nosql
2个回答
0
投票

在注释中,您已指定属性

data.visitInformation.dateOfVisit
data.overview.visitDate
将数据存储为日期数据类型。在查询中,提供了一个字符串作为
$gte
的比较。这比较了不同的数据类型,在绝大多数情况下不会产生预期的结果。

不要为

$gte
比较提供字符串,而是使用 ISODate 帮助程序,例如
ISODate('2024-11-19T00:00:00.000Z')
。这样,仅将日期数据类型相互比较。


-1
投票

MongoDB 不要求两组条件同时为真。相反,我们将在顶层将所有内容组合成一个 $or

{
  "state": "Review",
  "type": "Test",
  "subtype": { "$in": ["dr_visit", "annual_physical", "psychiatric_visit"] },
  "archived": false,
  "deleted": false,
  "$or": [
    {
      "$and": [
        {
          "$or": [
            { "account": "5dad84a4de014f0011999e27" },
            { "referral.user": "66cd7113e3887e0015522f05", "referral.accepted": true },
            { "referral.account": "5dad84a4de014f0011999e27", "referral.accepted": true }
          ]
        },
        {
          "$or": [
            { "data.visitInformation.dateOfVisit": { "$gte": "2024-11-19T00:00:00.000Z" } },
            { "data.overview.visitDate": { "$gte": "2024-11-19T00:00:00.000Z" } }
          ]
        }
      ]
    }
  ]
}
现在发生了什么: 顶层 $or 表示“要么这组条件匹配,要么那组条件匹配”。 第一组条件检查帐户或推荐字段。 第二组检查日期字段(dateOfVisit 或 VisitDate)。 这样,如果文档符合帐户/推荐条件或日期条件,它将被返回。 为什么这有效: 通过在顶层将两个 $or 条件分组为一个 $or,MongoDB 不再尝试同时匹配帐户/推荐和日期条件。它只需要匹配其中一组条件即可。

底线: 这应该允许查询返回满足帐户/推荐条件或日期条件的文档。尝试这个查询,看看它是否按预期工作!

如果问题解决了或者您遇到任何问题,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.