【问题标题】:mongo BadValue unknown operator: $ormongo BadValue 未知运算符:$or
【发布时间】:2015-03-16 03:01:28
【问题描述】:

该集合有一个文档:

{
    "_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
                    }
                ]
            }
        }
    }
}

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

无法规范化查询:BadValue 未知运算符:$or

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

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

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

topicWill Berkeley 中说

$or 应该在顶层

但在我的第二个标准中,$or 运算符不在顶层,即低于 $elemMatch 运算符,它可以工作。

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

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

    所以您的查询对象需要改为:

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

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

    【讨论】:

    • 谢谢,它有效!我知道在标准 javascript 环境中,new Date 使用 new 运算符创建 Date 对象。但令我困惑的是,ObjectId 在纯 mongo shell 中没有使用 new 运算符。你能给我看一份详细的 mongo 文档吗,因为官方文档中缺少很多有用的问题,例如 top level 问题。
    猜你喜欢
    • 2015-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2014-09-30
    • 1970-01-01
    • 2015-07-08
    • 2021-07-10
    相关资源
    最近更新 更多