mongo BadValue 未知运算符:$or
mongo BadValue unknown operator: $or
该集合有一个文档:
{
"_id" : ObjectId("54b513933aca242d9915a787"),
"carriers" : [
{
"carrier" : ObjectId("54b54d223aca242d9915a788"),
"carryingInterval" : {
"from" : ISODate("2013-12-31T23:00:00.000Z"),
"to" : null
}
}
]
}
我想做一个标准,就是找一个特定的载体和范围。
carryingInterval 的 from 和 to 字段可以是 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 字段小于 'now'。如果我从条件中跳过 from 字段,我就明白了。
在此topic威尔伯克利说
$or should be on the top level
但在我的第二个标准中,$or 运算符不在顶层,即低于 $elemMatch 运算符,并且有效。
我不明白这种行为。请给我解释一下!谢谢! :)
调用 Date()
returns 字符串,而不是 Date
;使用 new Date()
创建当前时间的 Date
对象。
所以您的查询对象需要看起来像这样:
{
carriers: {
$elemMatch: {
carrier: ObjectId('54b54d223aca242d9915a788'),
$or: [
{
"carryingInterval.from": {$lt: new Date()},
"carryingInterval.to": null
}
]
}
}
}
$or
可以在 $elemMatch
中使用,因为它有效地创建了一个关于 carriers
.
元素的新顶级查询对象
该集合有一个文档:
{
"_id" : ObjectId("54b513933aca242d9915a787"),
"carriers" : [
{
"carrier" : ObjectId("54b54d223aca242d9915a788"),
"carryingInterval" : {
"from" : ISODate("2013-12-31T23:00:00.000Z"),
"to" : null
}
}
]
}
我想做一个标准,就是找一个特定的载体和范围。 carryingInterval 的 from 和 to 字段可以是 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 字段小于 'now'。如果我从条件中跳过 from 字段,我就明白了。
在此topic威尔伯克利说
$or should be on the top level
但在我的第二个标准中,$or 运算符不在顶层,即低于 $elemMatch 运算符,并且有效。
我不明白这种行为。请给我解释一下!谢谢! :)
调用 Date()
returns 字符串,而不是 Date
;使用 new Date()
创建当前时间的 Date
对象。
所以您的查询对象需要看起来像这样:
{
carriers: {
$elemMatch: {
carrier: ObjectId('54b54d223aca242d9915a788'),
$or: [
{
"carryingInterval.from": {$lt: new Date()},
"carryingInterval.to": null
}
]
}
}
}
$or
可以在 $elemMatch
中使用,因为它有效地创建了一个关于 carriers
.