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
            }
        }
    ]
}

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

我的标准是:

{
    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.

元素的新顶级查询对象