gpt4 book ai didi

mongodb - mongo BadValue 未知运算符 : $or

转载 作者:可可西里 更新时间:2023-11-01 10:29:50 24 4
gpt4 key购买 nike

该集合有一个文档:

{
"_id" : ObjectId("54b513933aca242d9915a787"),
"carriers" : [
{
"carrier" : ObjectId("54b54d223aca242d9915a788"),
"carryingInterval" : {
"from" : ISODate("2013-12-31T23:00:00.000Z"),
"to" : null
}
}
]
}

我想做一个标准,就是找一个特定的载体和范围。carryingIntervalfromto 字段可以是Date 对象或null . null 值表示 +/- 无穷大。

我的标准是:

{
carriers: {
$elemMatch: {
carrier: ObjectId('54b54d223aca242d9915a788'),
carryingInterval: {
$or: [
{
from: {$lt: Date()},
to: null
}
]
}
}
}
}

此查询无法运行,并出现以下错误消息:

Can't canonicalize query: BadValue unknown operator: $or

好的,我尝试了其他标准,例如:

{
carriers: {
$elemMatch: {
carrier: ObjectId('54b54d223aca242d9915a788'),
$or: [
{
"carryingInterval.from": {$lt: Date()},
"carryingInterval.to": null
}
]
}
}
}

它运行时没有任何结果,但是文档中的 from 字段小于“现在”。如果我跳过标准中的 from 字段,我就明白了。

在此topic威尔伯克利说

$or should be on the top level

但在我的第二个标准中,$or 运算符不在顶层,它在 $elemMatch 运算符之下,但它有效。

我不明白这种行为。请给我解释一下!谢谢! :)

最佳答案

调用Date() 返回一个字符串,而不是Date;使用 new Date() 创建当前时间的 Date 对象。

所以你的查询对象需要看起来像这样:

{
carriers: {
$elemMatch: {
carrier: ObjectId('54b54d223aca242d9915a788'),
$or: [
{
"carryingInterval.from": {$lt: new Date()},
"carryingInterval.to": null
}
]
}
}
}

$or 可以在 $elemMatch 中使用,因为它有效地创建了一个关于 carriers 元素的新顶级查询对象.

关于mongodb - mongo BadValue 未知运算符 : $or,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28002055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com