我有一个 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
条件?非常感谢任何建议或见解!
在注释中,您已指定属性
data.visitInformation.dateOfVisit
和 data.overview.visitDate
将数据存储为日期数据类型。在查询中,提供了一个字符串作为 $gte
的比较。这比较了不同的数据类型,在绝大多数情况下不会产生预期的结果。
不要为
$gte
比较提供字符串,而是使用 ISODate 帮助程序,例如ISODate('2024-11-19T00:00:00.000Z')
。这样,仅将日期数据类型相互比较。
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" } }
]
}
]
}
]
}
底线: 这应该允许查询返回满足帐户/推荐条件或日期条件的文档。尝试这个查询,看看它是否按预期工作!
如果问题解决了或者您遇到任何问题,请告诉我!